青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

D3D中的光照(2)

5.4光源

Direct3D支持三種類型的光源。

點光源——這種光源在世界坐標中有一個位置且向所有方向上都照射光線。

方向光源——這種光源沒有位置但是向指定方向發出平行光線。

聚光燈——這種類型的光源和手電筒的光類似;它有位置并且發出的光在指定方向上按照圓錐形照射。這個圓錐形有兩個角度,θ和φ。角度θ描述內圓錐,φ描述外圓錐。

 

在代碼中一個燈光資源是通過D3DLIGHT9結構來表現的。

 typedef struct _D3DLIGHT9 {

       D3DLIGHTTYPE Type;

       D3DCOLORVALUE Diffuse;

       D3DCOLORVALUE Specular;

       D3DCOLORVALUE Ambient;

       D3DVECTOR Position;

       D3DVECTOR Direction;

       
float Range;

       
float Falloff;

       
float Attenuation0;

       
float Attenuation1;

       
float Attenuation2;

       
float Theta;

       
float Phi;

} D3DLIGHT9;

 

Type——定義燈光類型,我們能夠使用下面三種類型之一:D3DLIGHT_POINT, D3DLIGHT_SPOT, D3DLIGHT_DIRECTIONAL

Diffuse——此光源發出的漫射光顏色。

Specular——此光源發出的鏡面光顏色。

Ambient——此光源發出的環境光顏色。

Position——用一個向量來描述的光源世界坐標位置。這個值對于燈光的方向是無意義的。

Direction——用一個向量來描述的光源世界坐標照射方向。這個值不能用在點光源上。

Range——燈光能夠傳播的最大范圍。這個值不能比大。且不能用于方向光源。

Attenuation0, Attenuation1, Attenuation2——這些衰減變量被用來定義燈光強度的傳播距離衰減。它們只被用于點光源和聚光燈上。Attenuation0定義恒定衰減,Attenuation1定義線性衰減,Attenuation2定義二次衰減。適當的使用這個公式,D是代表到光源的距離,A0,A1,A2與Attenuation0,1,2相匹配。

                                         attenuation = 1/(A0 + A1D + A2D2)

Theta——只用于聚光燈;指定內圓錐的角度,單位是弧度。

Phi——只用于聚光燈;指定外圓錐的角度,單位是弧度。

現在只是演示怎樣使用InitDirectionalLight。其他的也很類似:

創建一個方向光源,它沿著x軸正方向照射白色燈光。我們按照下面的方法來做:

D3DXVECTOR3 dir(1.0f, 0.0f, 0.0f);

D3DXCOLOR c = d3d::WHITE;

D3DLIGHT9 dirLight = d3d::InitDirectionalLight(&dir, &c);

在把D3DLIGHT9初始化好以后,我們需要用Direct3D內在支持的燈光來注冊。就象這樣做:

Device->SetLight(

       0, // element in the light list to set, range is 0-maxlights

       &light);// address of the D3DLIGHT9 structure to set

一旦燈光注冊了,我們就能使用下面的列舉的例子來開或關燈光了:

Device->LightEnable(

       0, // the element in the light list to enable/disable

       true); // true = enable, false = disable

 

5.5實例程序:燈光

       這一章的例子是創建如圖5.7所顯示的場景。它示范了怎樣指定頂點法線,怎樣創建材質,以及怎樣創建和使用一個方向燈光。注意在這個示例程序中我們不會使用在文件d3dUtility.h/cpp中的材質和燈光函數。因為我們想展示怎樣手動來做這些設置。

 

圖5.7

 

給場景增加燈光的步驟是:

1、 允許使用燈光。

2、 為每個物體創建材質并且在渲染相應物體前應將材質附予物體。

3、 創建一個或多個光源,設置它們,把它們設為可用。

4、 將其他附加光源設為可用,比如鏡面高光。

/**************************************************************************************
  Renders a light pyramid.  Demonstrates how to specify the vertex normals, how to create 
  and set a material, and how to create and set a directional light.
 *************************************************************************************
*/

#include 
"d3dUtility.h"

#pragma warning(disable : 
4100)

class cLightVertex
{
public:
    
float m_x, m_y, m_z;
    
float m_nx, m_ny, m_nz; 

    cLightVertex() {}

    cLightVertex(
float x, float y, float z, float nx, float ny, float nz)
    {
        m_x  
= x;    m_y  = y;    m_z  = z;
        m_nx 
= nx;    m_ny = ny;    m_nz = nz;
    }
};

const DWORD LIGHT_VERTEX_FVF = D3DFVF_XYZ | D3DFVF_NORMAL;

////////////////////////////////////////////////////////////////////////////////////////////////////

const int WIDTH  = 640;
const int HEIGHT = 480;

IDirect3DDevice9
*        g_d3d_device  = NULL;
IDirect3DVertexBuffer9
*    g_pyramid_vb = NULL;

////////////////////////////////////////////////////////////////////////////////////////////////////

bool setup()
{    
    
// turn on lighting
    g_d3d_device->SetRenderState(D3DRS_LIGHTING, TRUE);

    g_d3d_device
->CreateVertexBuffer(12 * sizeof(cLightVertex), D3DUSAGE_WRITEONLY, LIGHT_VERTEX_FVF, 
                                     D3DPOOL_MANAGED, 
&g_pyramid_vb, NULL);

    
// fill the buffers with the triangle data

    cLightVertex
* vertices;

    g_pyramid_vb
->Lock(00, (void**)&vertices, 0);
    
    
// front face
    vertices[0= cLightVertex(-1.0f0.0f-1.0f0.0f0.707f-0.707f);
    vertices[
1= cLightVertex( 0.0f1.0f,  0.0f0.0f0.707f-0.707f);
    vertices[
2= cLightVertex( 1.0f0.0f-1.0f0.0f0.707f-0.707f);

    
// left face
    vertices[3= cLightVertex(-1.0f0.0f,  1.0f-0.707f0.707f0.0f);
    vertices[
4= cLightVertex( 0.0f1.0f,  0.0f-0.707f0.707f0.0f);
    vertices[
5= cLightVertex(-1.0f0.0f-1.0f-0.707f0.707f0.0f);

    
// right face
    vertices[6= cLightVertex( 1.0f0.0f-1.0f0.707f0.707f0.0f);
    vertices[
7= cLightVertex( 0.0f1.0f,  0.0f0.707f0.707f0.0f);
    vertices[
8= cLightVertex( 1.0f0.0f,  1.0f0.707f0.707f0.0f);

    
// back face
    vertices[9]  = cLightVertex( 1.0f0.0f,  1.0f0.0f0.707f0.707f);
    vertices[
10= cLightVertex( 0.0f1.0f,  0.0f0.0f0.707f0.707f);
    vertices[
11= cLightVertex(-1.0f0.0f,  1.0f0.0f0.707f0.707f);

    g_pyramid_vb
->Unlock();

    
// create and set the material

    D3DMATERIAL9 material;

    material.Ambient  
= WHITE;
    material.Diffuse  
= WHITE;
    material.Specular 
= WHITE;
    material.Emissive 
= BLACK;
    material.Power      
= 5.0f;

    g_d3d_device
->SetMaterial(&material);

    
// setup a directional light

    D3DLIGHT9 dir_light;
    ZeroMemory(
&dir_light, sizeof(dir_light));

    dir_light.Type        
= D3DLIGHT_DIRECTIONAL;
    dir_light.Diffuse    
= WHITE;
    dir_light.Specular  
= WHITE * 0.3f;
    dir_light.Ambient   
= WHITE * 0.3f;
    dir_light.Direction 
= D3DXVECTOR3(1.0f0.0f0.0f);

    
// set and enable the light
    g_d3d_device->SetLight(0&dir_light);
    g_d3d_device
->LightEnable(0, TRUE);

    
// turn on specular lighting and instruct Direct3D to renormalize normals
    g_d3d_device->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE);
    g_d3d_device
->SetRenderState(D3DRS_SPECULARENABLE, TRUE);

    
// position and aim the camera

    D3DXMATRIX view_matrix;

    D3DXVECTOR3 pos(
0.0f1.0f-3.0f);
    D3DXVECTOR3 target(
0.0f0.0f0.0f);
    D3DXVECTOR3 up(
0.0f1.0f0.0f);

    D3DXMatrixLookAtLH(
&view_matrix, &pos, &target, &up);
    g_d3d_device
->SetTransform(D3DTS_VIEW, &view_matrix);

    
// set the projection matrix

    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
&proj, D3DX_PI * 0.5f, (float)WIDTH/HEIGHT, 1.0f1000.0f);

    g_d3d_device
->SetTransform(D3DTS_PROJECTION, &proj);
    
    
return true;
}

void cleanup()
{
    safe_release
<IDirect3DVertexBuffer9*>(g_pyramid_vb);
}

bool display(float time_delta)
{
    
// update the scene: rotate the pyramid

    D3DXMATRIX y_rot;
    
static float y = 0.0f;

    D3DXMatrixRotationY(
&y_rot, y);
    y 
+= time_delta;

    
if(y >= 6.28f)
        y 
= 0.0f;

    g_d3d_device
->SetTransform(D3DTS_WORLD, &y_rot);

    
// draw the scene

    g_d3d_device
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x000000001.0f0);

    g_d3d_device
->BeginScene();

    g_d3d_device
->SetStreamSource(0, g_pyramid_vb, 0sizeof(cLightVertex));
    g_d3d_device
->SetFVF(LIGHT_VERTEX_FVF);
    g_d3d_device
->DrawPrimitive(D3DPT_TRIANGLELIST, 04);
    
    g_d3d_device
->EndScene();

    g_d3d_device
->Present(NULL, NULL, NULL, NULL);

    
return true;
}

LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
{
    
switch(msg)
    {
    
case WM_DESTROY:
        PostQuitMessage(
0);
        
break;

    
case WM_KEYDOWN:
        
if(word_param == VK_ESCAPE)
            DestroyWindow(hwnd);
        
break;
    }

    
return DefWindowProc(hwnd, msg, word_param, long_param);
}

int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
{
    
if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_d3d_device))
    {
        MessageBox(NULL, 
"init_d3d() - failed."0, MB_OK);
        
return 0;
    }

    
if(! setup())
    {
        MessageBox(NULL, 
"Steup() - failed."0, MB_OK);
        
return 0;
    }

    enter_msg_loop(display);

    cleanup();
    g_d3d_device
->Release();

    
return 0;
}

 


Setup函數給場景加入燈光。首先允許使用燈光,當然這不是必須的因為默認設置就是允許使用燈光的。

下一步,我們創建頂點緩存,鎖定,并且把“金字塔”的三角形頂點放入其中。頂點法線是利用5.3節中的運算法則預先計算好的。注意三角形共享頂點,但它們的法線不能共享;因此對這個物體使用索引列表并不是最有利的。例如,所有三角形都共享頂點(0,1,0);然而,對每個三角形,它們的頂點法線是不相同的。

為物體產生了頂點數據以后,我們描述利用燈光表現各自材質的物體間是怎樣相互影響的。在這個例子中,“金字塔”反射出白光,自身不發光,且會產生一些高光。

接著,我們創建一個方向光并將其設為可用。方向光是沿著x軸的正方向照射的。燈光照射最強的白色漫射光(dir.Diffuse = WHITE),較弱的白色鏡面光(dir.Specular = WHITE * 0.3f)以及一個中等強度的白色環境光(dir.Ambient = WHITE *0.6f)。

最后,我們設置狀態使法線重新單位化且把鏡面高光設置為可用。


下載源程序


posted on 2008-03-16 13:58 lovedday 閱讀(1024) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一本一本久久| 在线观看国产精品淫| 亚洲一区二区视频| 一本色道精品久久一区二区三区| 欧美激情导航| 亚洲人成在线免费观看| 亚洲天堂av图片| 亚洲观看高清完整版在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产精品美女999| 欧美成人一二三| 欧美激情一区二区三区高清视频 | 免播放器亚洲一区| 欧美va天堂在线| 欧美精品七区| 欧美午夜宅男影院在线观看| 国产九九精品视频| 亚洲国产精彩中文乱码av在线播放| 一本色道久久综合狠狠躁篇的优点 | 亚洲欧美视频在线观看| 欧美成人一区二区三区片免费| 亚洲午夜电影网| 欧美极品色图| 国产精品成人一区二区三区夜夜夜 | 亚洲综合日本| 男男成人高潮片免费网站| 一区二区三区成人| 欧美日韩伦理在线免费| 一区二区自拍| 在线观看亚洲视频啊啊啊啊| 午夜精品久久久久影视| 欧美 日韩 国产一区二区在线视频 | 亚洲自拍偷拍麻豆| 欧美一级二级三级蜜桃| 久久这里只有精品视频首页| 午夜在线电影亚洲一区| 欧美日韩中文另类| 亚洲美女在线视频| 欧美国产一区二区三区激情无套| 久久精品日韩欧美| 国产亚洲欧美一区二区| 久久久久国产精品一区| 欧美一区三区三区高中清蜜桃 | 一区二区欧美日韩| 欧美涩涩视频| 狂野欧美激情性xxxx欧美| 久久久久久久波多野高潮日日| 国产综合18久久久久久| 久久午夜激情| 欧美性色视频在线| 免费成人你懂的| 国产精品久久久亚洲一区 | 国产精品自在欧美一区| 蜜臀久久99精品久久久画质超高清 | 老巨人导航500精品| 欧美日韩国产成人在线| 久久久噜噜噜久久人人看| 欧美精品久久久久久久免费观看| 久久国产成人| 欧美性开放视频| 欧美96在线丨欧| 欧美jizz19性欧美| 欧美日韩一区二区在线视频 | 欧美一区二区三区视频免费播放| 毛片精品免费在线观看| 欧美国产精品v| 在线免费观看日韩欧美| 久久久午夜电影| 欧美国产亚洲另类动漫| 国模精品娜娜一二三区| 欧美一区二区三区婷婷月色| 亚洲欧美一级二级三级| 欧美精品乱码久久久久久按摩| 久久久久久97三级| 国产一区高清视频| 欧美在线观看你懂的| 久久久精品国产一区二区三区 | 午夜精品久久久久久久久久久久久| 在线亚洲免费| 国产精品自拍一区| 欧美专区在线观看| 久久久久久一区| 亚洲毛片在线| 欧美日韩在线亚洲一区蜜芽| 亚洲欧洲一区二区在线观看 | 国产精品免费看片| 欧美在线中文字幕| 99一区二区| 久久免费黄色| 中文日韩在线视频| 韩国成人精品a∨在线观看| 久久综合九九| 亚洲夜间福利| 亚洲精品一区在线观看香蕉| 欧美成人激情视频| 亚洲欧洲一区二区天堂久久| 亚洲女人天堂成人av在线| 亚洲国产精品一区二区三区| 国产精品腿扒开做爽爽爽挤奶网站 | 国产精品久久久久久久久免费樱桃| 新67194成人永久网站| 亚洲福利视频免费观看| 欧美一区日本一区韩国一区| 亚洲精品久久久一区二区三区| 国产一区免费视频| 国产女人aaa级久久久级| 欧美精选在线| 欧美高清视频在线| 欧美精品入口| 欧美激情综合五月色丁香小说| 欧美在线观看视频一区二区| 亚洲小说春色综合另类电影| 一区二区三区国产精品| 91久久精品国产91久久性色| 亚洲国产精品悠悠久久琪琪| 亚洲国产另类久久精品| 亚洲九九精品| 亚洲性夜色噜噜噜7777| 亚洲视频专区在线| 一区二区三区四区国产| 亚洲制服欧美中文字幕中文字幕| 一本久久a久久免费精品不卡| 一区二区三区精品视频在线观看| 一区二区国产精品| 六月婷婷一区| 欧美午夜美女看片| 亚洲电影观看| 久久成人国产| 亚洲美女中出| 免费一级欧美片在线观看| 欧美性久久久| 亚洲国产精品成人综合| 午夜精品视频一区| 狠狠色综合日日| 一区二区欧美日韩| 免费在线成人av| 亚洲欧美另类中文字幕| 欧美激情精品久久久久久大尺度| 欧美日韩日日夜夜| 亚洲人成人一区二区三区| 免费中文日韩| 久久国产乱子精品免费女 | 欧美大片免费看| 国产亚洲精品v| 一区二区三区日韩在线观看| 久久亚洲春色中文字幕| 国产最新精品精品你懂的| 新狼窝色av性久久久久久| 亚洲精选久久| 欧美日韩综合一区| 午夜久久福利| 香蕉精品999视频一区二区| 国产噜噜噜噜噜久久久久久久久| 亚洲视频专区在线| 亚洲精品在线一区二区| 欧美乱妇高清无乱码| 一区二区三区精品视频| 99国产精品99久久久久久| 国产精品久久激情| 美乳少妇欧美精品| 欧美日韩一区在线视频| 午夜影院日韩| 久久国产日韩欧美| 99精品免费网| 午夜在线精品| 日韩一级精品| 亚洲综合第一页| 亚洲精品小视频| 性做久久久久久| 亚洲最新在线| 久久另类ts人妖一区二区| 亚洲一区二区三区在线视频| 老司机精品视频网站| 亚洲性图久久| 欧美电影免费观看高清完整版| 欧美电影打屁股sp| 午夜激情综合网| 欧美激情aⅴ一区二区三区 | 欧美激情亚洲精品| 久久成人精品电影| 欧美日韩理论| 欧美成人一品| 激情久久婷婷| 久久麻豆一区二区| 久久综合伊人77777| 国产午夜精品美女视频明星a级 | 最新高清无码专区| 国产欧美va欧美va香蕉在| 一区二区三区四区五区视频| 91久久精品国产91久久性色| 久久伊伊香蕉| 欧美成人一区二区在线| 91久久精品国产91性色| 久久只精品国产| 亚洲精品国产精品国自产观看浪潮 | 亚洲国产日韩欧美在线动漫| 91久久久亚洲精品| 国产精品乱码妇女bbbb| 一区二区不卡在线视频 午夜欧美不卡在 | 蜜臀va亚洲va欧美va天堂|