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

天行健 君子當自強而不息

光照與材質(5)

多光源光照示例程序

在示例程序MultiLights中一共使用了三個光源,分別是漫反射方向光光源、漫反射點光源、鏡面反射方向光光源,而且可以控制分別使用三個光源和同時使用三個光源的顯示效果。為了測試不同光源的光照效果,在示例程序中通過鍵盤上的數字鍵來控制3個光源的啟用。

 

按下數字鍵1,開啟1號光源,關閉2號和3號光源,從而可以觀察方向光漫反射效果。

 


按下數字鍵2,開啟2號光源,關閉1號和3號光源,從而可以觀察點光源漫反射效果。

 


按下數字鍵3,開啟3號光源,關閉1號和1號光源,從而可以觀察方向光鏡面反射效果。


 

按下數字鍵4,同時開啟3個光源,可以觀察同時使用多個光源的效果。


按下數字鍵0,返回默認狀態,只啟用環境光,關閉所有光源。


按下數字鍵5,啟用FLAT著色模式。


按下數字鍵6,啟用GOURAUD著色模式(默認著色模式)。
 

源程序:

#include <d3dx9.h>

#pragma warning(disable : 
4127)

#define CLASS_NAME    "GameApp"

#define release_com(p)    do { if(p) { (p)->Release(); (p) = NULL; } } while(0)

IDirect3D9
*                g_d3d;
IDirect3DDevice9
*        g_device;
IDirect3DVertexBuffer9
* g_vertex_buffer;

struct sCustomVertex
{
    D3DXVECTOR3    position;
    D3DXVECTOR3    normal;
};

#define D3DFVF_CUSTOM_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL) 

void init_geometry()
{    
    g_device
->CreateVertexBuffer(50 * 2 * sizeof(sCustomVertex), 0, D3DFVF_CUSTOM_VERTEX, D3DPOOL_DEFAULT, 
                                 
&g_vertex_buffer, NULL);

    sCustomVertex
* vertices;

    g_vertex_buffer
->Lock(00, (void**)&vertices, 0);

    
for(int i = 0; i < 50; i++)
    {
        
float theta = (2 * D3DX_PI * i) / (50 - 1);

        vertices[
2 * i + 0].position = D3DXVECTOR3(sin(theta), -1.0f, cos(theta));
        vertices[
2 * i + 0].normal   = D3DXVECTOR3(sin(theta),  0.0f, cos(theta));
        vertices[
2 * i + 1].position = D3DXVECTOR3(sin(theta),  1.0f, cos(theta));
        vertices[
2 * i + 1].normal   = D3DXVECTOR3(sin(theta),  0.0f, cos(theta));
    }
    
    g_vertex_buffer
->Unlock();
}

void setup_matrices()
{
    
// build world matrix
    
    D3DXMATRIX mat_world;
    D3DXMatrixIdentity(
&mat_world);
    g_device
->SetTransform(D3DTS_WORLD, &mat_world);

    
// setup view matrix

    D3DXVECTOR3 eye(
0.0f3.0f-5.0f);
    D3DXVECTOR3 at(
0.0f0.0f0.0f);
    D3DXVECTOR3 up(
0.0f1.0f0.0f);

    D3DXMATRIX mat_view;
    D3DXMatrixLookAtLH(
&mat_view, &eye, &at, &up);
    g_device
->SetTransform(D3DTS_VIEW, &mat_view);

    
// setup projection matrix

    D3DXMATRIX mat_proj;
    D3DXMatrixPerspectiveFovLH(
&mat_proj, D3DX_PI/41.33f1.0f100.0f);
    g_device
->SetTransform(D3DTS_PROJECTION, &mat_proj);
}

bool init_d3d(HWND hwnd)
{
    g_d3d 
= Direct3DCreate9(D3D_SDK_VERSION);

    
if(g_d3d == NULL)
        
return false;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(
&d3dpp, sizeof(d3dpp));

    d3dpp.Windowed                    
= TRUE;
    d3dpp.SwapEffect                
= D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat            
= D3DFMT_UNKNOWN;
    d3dpp.EnableAutoDepthStencil    
= TRUE;            // Direct3D will manage depth buffers for the application
    d3dpp.AutoDepthStencilFormat    = D3DFMT_D16;    // 16-bit z-buffer bit depth

    
if(FAILED(g_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  
&d3dpp, &g_device)))
    {
        
return false;
    }
    
    init_geometry();
    setup_matrices();

    g_device
->SetRenderState(D3DRS_ZENABLE,            TRUE);
    g_device
->SetRenderState(D3DRS_SPECULARENABLE,  TRUE);    
    g_device
->SetRenderState(D3DRS_CULLMODE,        D3DCULL_NONE);        
    
    
return true;
}

void cleanup()
{
    release_com(g_vertex_buffer);
    release_com(g_device);
    release_com(g_d3d);
}

void setup_material_light()
{
    
// setup material

    D3DMATERIAL9 material;
    ZeroMemory(
&material, sizeof(material));

    material.Diffuse.r 
= material.Ambient.r = material.Specular.r = 0.3f;
    material.Diffuse.g 
= material.Ambient.g = material.Specular.g = 1.0f;
    material.Diffuse.b 
= material.Ambient.b = material.Specular.b = 1.0f;
    material.Diffuse.a 
= material.Ambient.a = material.Specular.a = 1.0f;

    g_device
->SetMaterial(&material);

    
// setup light1

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

    light1.Type        
= D3DLIGHT_DIRECTIONAL;
    light1.Diffuse.r 
= 1.0f;
    light1.Diffuse.g 
= 0.8f;
    light1.Diffuse.b 
= 1.0f;    
    light1.Direction 
= D3DXVECTOR3(-10010);
    
    g_device
->SetLight(0&light1);
    
    
// setup light2

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

    light2.Type         
= D3DLIGHT_POINT;
    light2.Diffuse.r 
= 1.0f;
    light2.Diffuse.g 
= 1.0f;
    light2.Diffuse.b 
= 0.0f;

    
float time = timeGetTime() / 350.0f;
    light2.Position 
= D3DXVECTOR3(10 * sin(time), 010 * cos(time));

    light2.Range        
= 100.0f;
    light2.Attenuation0 
= 1.0f;

    g_device
->SetLight(1&light2);

    
// setup light3

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

    light3.Type          
= D3DLIGHT_DIRECTIONAL;
    light3.Specular.r 
= 1.0f;
    light3.Specular.g 
= 0.5f;
    light3.Specular.b 
= 0.5f;
    light3.Specular.a 
= 1.0f;

    light3.Direction 
= D3DXVECTOR3(-10010);

    g_device
->SetLight(2&light3);

    g_device
->SetRenderState(D3DRS_AMBIENT, 0x00777777);    
}

void render()
{
    g_device
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(555), 1.0f0);

    g_device
->BeginScene();

    setup_material_light();

    g_device
->SetStreamSource(0, g_vertex_buffer, 0sizeof(sCustomVertex));
    g_device
->SetFVF(D3DFVF_CUSTOM_VERTEX);
    g_device
->DrawPrimitive(D3DPT_TRIANGLESTRIP, 02 * 50 - 2);

    g_device
->EndScene();

    g_device
->Present(NULL, NULL, NULL, NULL);
}

LRESULT WINAPI WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    
switch(msg)
    {
    
case WM_KEYDOWN:
        
switch(wParam)
        {
        
case VK_ESCAPE:
            DestroyWindow(hwnd);
            
return 0;

        
case 48:    // key "0", disalbe all lights, only use ambient light.
            g_device->LightEnable(0, FALSE);
            g_device
->LightEnable(1, FALSE);
            g_device
->LightEnable(2, FALSE);
            
break;

        
case 49:    // key "1", enable lights 1, disable other lights.
            g_device->LightEnable(0, TRUE);
            g_device
->LightEnable(1, FALSE);
            g_device
->LightEnable(2, FALSE);
            
break;

        
case 50:    // key "2", enable lights 2, disable other lights.
            g_device->LightEnable(0, FALSE);
            g_device
->LightEnable(1, TRUE);
            g_device
->LightEnable(2, FALSE);
            
break;
    
        
case 51:    // key "3", enable lights 3, disable other lights.
            g_device->LightEnable(0, FALSE);
            g_device
->LightEnable(1, FALSE);
            g_device
->LightEnable(2, TRUE);
            
break;

        
case 52:    // key "4", enable all lights.
            g_device->LightEnable(0, TRUE);
            g_device
->LightEnable(1, TRUE);
            g_device
->LightEnable(2, TRUE);
            
break;

        
case 53:    // key "5", flat shade mode.
            g_device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
            
break;

        
case 54:    // key "6", gouraud shade mode.
            g_device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
            
break;
        }
            
        
break;

    
case WM_DESTROY:        
        PostQuitMessage(
0);
        
return 0;
    }

    
return DefWindowProc(hwnd, msg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE inst, HINSTANCE, LPSTR, INT)
{
    WNDCLASSEX wc;

    wc.cbSize            
= sizeof(WNDCLASSEX);
    wc.style            
= CS_CLASSDC;
    wc.lpfnWndProc        
= WinProc;
    wc.cbClsExtra        
= 0;
    wc.cbWndExtra        
= 0;
    wc.hInstance        
= inst;
    wc.hIcon            
= NULL;
    wc.hCursor            
= NULL;
    wc.hbrBackground    
= NULL;
    wc.lpszMenuName        
= NULL;
    wc.lpszClassName    
= CLASS_NAME;
    wc.hIconSm            
= NULL;

    
if(! RegisterClassEx(&wc))
        
return -1;

    HWND hwnd 
= CreateWindow(CLASS_NAME, "Direct3D App", WS_OVERLAPPEDWINDOW, 200100640480,
                             NULL, NULL, wc.hInstance, NULL);    

    
if(hwnd == NULL)
        
return -1;

    
if(init_d3d(hwnd))
    {
        ShowWindow(hwnd, SW_SHOWDEFAULT);
        UpdateWindow(hwnd);

        MSG msg;
        ZeroMemory(
&msg, sizeof(msg));

        
while(msg.message != WM_QUIT)
        {
            
if(PeekMessage(&msg, NULL, 00, PM_REMOVE))
            {
                TranslateMessage(
&msg);
                DispatchMessage(
&msg);
            }
                
            render();
        }
    }

    cleanup();
    UnregisterClass(CLASS_NAME, wc.hInstance);    

    
return 0;
}

場景中的環境光有兩個來源:一是通過渲染狀態設置的全局環境光,二是通過每個光源中的環境光屬性設置的環境光。建議通過渲染狀態設置一個整體上的環境光,對于場景中的各個光源不設置其環境光屬性,因為在同一個場景中,對于每個物體其接受到的環境光應當相同,所以通過渲染狀態設置一個整體上的環境光比較方便,也符合實際情況。

在Direct3D中,光源和材質是互不分離、相互作用的兩部分,光源是相對于整個場景的,而材質是相對于每個物體的。兩者相互作用,共同決定最終的渲染結果,這樣雖然靈活但不易控制,所以光源和物體表面材質的設置應盡量符合現實情況。例如,可將光源設為白光,將各個物體材質顏色設為真實顏色,當然為了得到特殊的效果,可以在某些方面進行夸張。


posted on 2008-05-04 16:05 lovedday 閱讀(989) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(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>
            亚洲第一精品在线| 欧美一区视频| 一卡二卡3卡四卡高清精品视频| 99国产一区| 欧美成人官网二区| 久久国产色av| 国产日韩精品在线播放| 99天天综合性| 欧美第十八页| 久久影视精品| 在线观看欧美日韩国产| 久久久中精品2020中文| 欧美综合激情网| 国内外成人免费视频| 久久精品久久99精品久久| 午夜国产精品视频| 国产午夜精品久久久| 久久精品国语| 乱人伦精品视频在线观看| 亚洲高清自拍| 最新国产精品拍自在线播放| 欧美激情精品| 中日韩高清电影网| 亚洲一区二区三区欧美| 国产精品久99| 欧美一区高清| 久久久久久久综合色一本| 亚洲第一中文字幕| 亚洲欧洲在线一区| 国产精品每日更新| 久久亚洲一区| 欧美激情一区二区三区高清视频| 一区二区精品| 亚洲国产一区视频| 欧美一区二区黄| 欧美久久成人| 性刺激综合网| 久久在线免费观看视频| 夜夜嗨av一区二区三区四季av| 日韩网站在线看片你懂的| 国产精品美女在线观看| 久久综合久久美利坚合众国| 欧美激情精品久久久六区热门| 午夜欧美大片免费观看| 久久蜜臀精品av| 亚洲视频综合| 久久精品三级| 亚洲一区二区三区777| 久久狠狠一本精品综合网| 日韩午夜在线播放| 欧美在线免费观看| 一区二区激情小说| 久久精品在线| 国产精品99久久久久久久久| 久久精品道一区二区三区| av成人毛片| 久久久福利视频| 亚洲先锋成人| 免费试看一区| 久久久久久久高潮| 国产精品xxxav免费视频| 免费欧美日韩国产三级电影| 国产精品劲爆视频| 亚洲精品一区二区三区樱花| 激情一区二区| 香蕉久久夜色精品国产| 一个人看的www久久| 久久久久五月天| 性一交一乱一区二区洋洋av| 欧美精品激情blacked18| 美女主播一区| 狠狠入ady亚洲精品经典电影| 夜夜嗨av色一区二区不卡| 亚洲电影专区| 久久久久99| 久久精品国产综合| 国产精品入口| 一二三区精品福利视频| 日韩一区二区免费高清| 久久综合色综合88| 久久免费黄色| 韩国一区二区三区在线观看| 亚洲欧美日韩网| 午夜亚洲福利在线老司机| 欧美性感一类影片在线播放| 亚洲精品一区二区三区四区高清| 亚洲日本欧美| 欧美99久久| 亚洲国产精品久久久久秋霞蜜臀| 亚洲高清免费视频| 裸体丰满少妇做受久久99精品| 蜜桃av一区二区在线观看| 国产自产v一区二区三区c| 亚洲欧美日韩精品久久| 欧美一区午夜精品| 国产亚洲va综合人人澡精品| 午夜精品久久久久久久99热浪潮| 欧美一区二区黄色| 国产午夜精品美女视频明星a级| 国产日韩久久| 欧美成人免费在线观看| 亚洲高清精品中出| 欧美国产第一页| 日韩视频永久免费观看| 亚洲午夜精品久久久久久app| 欧美深夜福利| 亚洲欧美乱综合| 久久精选视频| 亚洲福利视频一区| 欧美a级一区| 亚洲精品字幕| 欧美一区免费| 亚洲电影毛片| 欧美日韩免费区域视频在线观看| 亚洲日本在线观看| 亚洲午夜精品久久久久久浪潮| 国产精品久久久久一区二区三区共 | 亚洲欧美在线免费观看| 国产女精品视频网站免费| 久久精品免费电影| 欧美激情按摩在线| 亚洲一区二区三区久久| 国产婷婷精品| 欧美大片免费观看在线观看网站推荐| 亚洲美女诱惑| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲人成亚洲人成在线观看| 欧美午夜片在线观看| 久久成人免费电影| 亚洲另类视频| 久久综合999| 宅男噜噜噜66国产日韩在线观看| 国产免费亚洲高清| 欧美成人免费在线视频| 亚洲欧美日韩区| 亚洲欧洲精品一区二区三区不卡 | 国产一区深夜福利| 欧美国产一区二区三区激情无套| 亚洲性av在线| 亚洲激情黄色| 久久乐国产精品| 一区二区三区视频免费在线观看 | 午夜国产精品视频| 亚洲国产精品成人久久综合一区| 国产精品99一区| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲欧美日韩视频二区| aa级大片欧美| 亚洲国产一区视频| 噜噜噜噜噜久久久久久91| 香港久久久电影| 亚洲精品综合在线| **欧美日韩vr在线| 国产日韩欧美综合| 国产精品sm| 欧美日韩在线播放一区二区| 女主播福利一区| 久久高清免费观看| 亚洲一区二区日本| 999在线观看精品免费不卡网站| 亚洲黄色成人网| 久久久久看片| 午夜一区在线| 亚洲欧美国产高清| 99热这里只有精品8| 亚洲国产精品免费| 欧美va亚洲va香蕉在线| 久久久精品999| 欧美影院成年免费版| 亚洲欧美激情一区二区| 亚洲无线一线二线三线区别av| 99精品久久久| 中国女人久久久| 亚洲一区二区三区免费在线观看| 99精品欧美一区二区蜜桃免费| 亚洲国产综合在线| 亚洲精品国产品国语在线app| 亚洲电影在线免费观看| 亚洲国产中文字幕在线观看| 亚洲激情一区| 亚洲日本无吗高清不卡| 亚洲精品免费一二三区| 亚洲麻豆视频| 在线综合亚洲欧美在线视频| 宅男噜噜噜66一区二区| 亚洲一区在线直播| 欧美在线1区| 久久女同精品一区二区| 久久青草久久| 欧美搞黄网站| 日韩午夜精品视频| 亚洲私人影院| 欧美在线观看你懂的| 久久久激情视频| 牛牛影视久久网| 国产精品国产三级国产普通话99 | 精品成人一区二区| 亚洲激情av| 亚洲一级免费视频| 久久精品国产精品亚洲精品|