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

天行健 君子當自強而不息

光照與材質(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>
            亚洲视频免费在线| 亚洲欧美影院| 欧美特黄a级高清免费大片a级| 亚洲激情影院| 欧美大片免费| 91久久精品国产91久久性色tv| 欧美一级理论性理论a| 国产欧美高清| 黑人极品videos精品欧美裸| 在线观看不卡av| 99pao成人国产永久免费视频| 国产久一道中文一区| 欧美成人高清视频| 久久久精品日韩欧美| 国产精品女同互慰在线看| 亚洲午夜精品17c| 亚洲婷婷综合久久一本伊一区| 欧美日韩国产bt| 欧美日韩国产精品| 国产精品影音先锋| 黄色成人在线免费| 99精品视频免费观看视频| 亚洲小视频在线| 午夜国产不卡在线观看视频| 久久综合久久88| 欧美午夜免费| 欧美日韩视频在线一区二区观看视频 | 欧美午夜电影在线观看| 国产精品日韩欧美一区二区三区| 裸体丰满少妇做受久久99精品| 亚洲欧美激情一区二区| 亚洲影音先锋| 免费精品99久久国产综合精品| 在线综合+亚洲+欧美中文字幕| 亚洲国产精品va在看黑人| 亚洲毛片一区二区| 久久黄色影院| 国产精品一卡二| 日韩视频在线观看| 久久综合中文| 亚洲男女自偷自拍| 欧美区亚洲区| 亚洲高清视频在线| 久久野战av| 久久只有精品| 中日韩视频在线观看| 亚洲在线一区二区| 亚洲天堂久久| 欧美精品久久99久久在免费线| 欧美国产视频一区二区| 国产精品一区视频网站| av成人手机在线| 欧美电影美腿模特1979在线看| 亚洲国产精品久久久久秋霞不卡| 久热国产精品| 久久一区亚洲| 午夜一级在线看亚洲| 国产一区二区无遮挡| 欧美日韩在线看| 亚洲国产高清一区| 久久夜色精品亚洲噜噜国产mv | 99精品国产热久久91蜜凸| 久久国产精品亚洲va麻豆| 国产小视频国产精品| 午夜精品久久久久久久白皮肤| 亚洲精品视频在线观看免费| 玖玖玖免费嫩草在线影院一区| 亚洲大片在线观看| 久久裸体艺术| 亚洲国产天堂久久国产91| 欧美激情第六页| 欧美精品国产精品| 亚洲淫性视频| 欧美伊人久久大香线蕉综合69| 欧美成人激情视频| 91久久中文| av不卡在线看| 美女精品自拍一二三四| 亚洲一区二区高清| 亚洲婷婷综合色高清在线| 国产精品扒开腿做爽爽爽软件| 欧美一区1区三区3区公司| 亚洲亚洲精品在线观看| 99精品欧美一区二区蜜桃免费| 一区二区欧美视频| 欧美日韩综合| 久久aⅴ国产紧身牛仔裤| 欧美一区久久| 亚洲激情在线激情| 日韩一本二本av| 国产日产欧美一区| 欧美69视频| 国产精品高清网站| 亚洲国产欧美一区| 亚洲精品你懂的| 久久亚洲影院| 亚洲免费一在线| 久久亚洲综合色| 亚洲视频一区二区在线观看| 亚洲一区二区三区激情| 免费观看一区| 亚洲四色影视在线观看| 亚洲愉拍自拍另类高清精品| 国产一区二区看久久| 亚洲高清免费在线| 欧美涩涩网站| 欧美国产精品日韩| 国产精品午夜电影| 亚洲国产精品久久久久| 欧美日韩午夜视频在线观看| 久久国产精品毛片| 欧美日韩国产在线观看| 久久男人资源视频| 久久成人一区| 日韩视频一区二区| 香蕉久久夜色精品国产| 亚洲人成在线观看一区二区| 久久嫩草精品久久久精品一| 欧美精品国产精品| 免费高清在线视频一区·| 国产精品久久久久久久久搜平片| 亚洲欧美日韩一区在线| 久久午夜电影| 欧美亚洲一级片| 欧美日韩在线不卡一区| 亚洲人成在线观看| 久久欧美中文字幕| 一区二区三区亚洲| 亚洲免费在线观看| 国产欧美日韩综合精品二区| 久久aⅴ国产欧美74aaa| 欧美国产日本在线| 亚洲激情中文1区| 久久国产精品99国产| 亚洲免费伊人电影在线观看av| 亚洲网站在线播放| 亚洲精品视频啊美女在线直播| 欧美成人免费在线观看| 国产亚洲一级| 久久国产精品久久精品国产| 久久精品国产一区二区三区免费看| 亚洲最新视频在线播放| 亚洲青色在线| 欧美精品成人| 久久青草久久| 欧美一区二区三区日韩| 久久久久久亚洲精品杨幂换脸| 国内精品模特av私拍在线观看| 欧美在线视频不卡| 欧美先锋影音| 亚洲视屏在线播放| 午夜久久tv| 一区二区三区在线不卡| 开元免费观看欧美电视剧网站| 国产一区二区黄| 亚洲视频精品| 久久精品国产亚洲aⅴ| 在线播放中文一区| 欧美精品一区二区三区蜜臀| 亚洲福利一区| 亚洲视频一区| 国产亚洲一区二区三区在线观看| 欧美日本一区| 亚洲欧美另类久久久精品2019| 久久人人97超碰人人澡爱香蕉| 牛人盗摄一区二区三区视频| 亚洲第一视频网站| 亚洲桃花岛网站| 国产区精品在线观看| 亚洲日本成人女熟在线观看| 夜夜嗨av色一区二区不卡| 欧美一区二区在线观看| 欧美 日韩 国产 一区| 9l国产精品久久久久麻豆| 国产精品裸体一区二区三区| 亚洲国产精品久久91精品| 亚洲新中文字幕| 一区国产精品| 欧美午夜精品久久久久久超碰| 91久久精品日日躁夜夜躁国产| 国产亚洲成av人在线观看导航 | 欧美激情四色 | 久久国内精品视频| 欧美一区日韩一区| 伊甸园精品99久久久久久| 亚洲欧美久久久久一区二区三区| 亚洲人成在线播放| 国产精品亚洲片夜色在线| 欧美成人精品一区| 亚洲第一免费播放区| 亚洲综合丁香| 日韩视频中文字幕| 亚洲大胆女人| 国产色视频一区| 欧美日韩免费| 亚洲一区日韩在线| 亚洲综合成人在线| 亚洲人成绝费网站色www| 韩国视频理论视频久久| 国产精品午夜视频|