• <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>

            天行健 君子當(dāng)自強(qiáng)而不息

            光照與材質(zhì)(5)

            多光源光照示例程序

            在示例程序MultiLights中一共使用了三個(gè)光源,分別是漫反射方向光光源、漫反射點(diǎn)光源、鏡面反射方向光光源,而且可以控制分別使用三個(gè)光源和同時(shí)使用三個(gè)光源的顯示效果。為了測(cè)試不同光源的光照效果,在示例程序中通過(guò)鍵盤(pán)上的數(shù)字鍵來(lái)控制3個(gè)光源的啟用。

             

            按下數(shù)字鍵1,開(kāi)啟1號(hào)光源,關(guān)閉2號(hào)和3號(hào)光源,從而可以觀察方向光漫反射效果。

             


            按下數(shù)字鍵2,開(kāi)啟2號(hào)光源,關(guān)閉1號(hào)和3號(hào)光源,從而可以觀察點(diǎn)光源漫反射效果。

             


            按下數(shù)字鍵3,開(kāi)啟3號(hào)光源,關(guān)閉1號(hào)和1號(hào)光源,從而可以觀察方向光鏡面反射效果。


             

            按下數(shù)字鍵4,同時(shí)開(kāi)啟3個(gè)光源,可以觀察同時(shí)使用多個(gè)光源的效果。


            按下數(shù)字鍵0,返回默認(rèn)狀態(tài),只啟用環(huán)境光,關(guān)閉所有光源。


            按下數(shù)字鍵5,啟用FLAT著色模式。


            按下數(shù)字鍵6,啟用GOURAUD著色模式(默認(rèn)著色模式)。
             

            源程序:

            #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;
            }

            場(chǎng)景中的環(huán)境光有兩個(gè)來(lái)源:一是通過(guò)渲染狀態(tài)設(shè)置的全局環(huán)境光,二是通過(guò)每個(gè)光源中的環(huán)境光屬性設(shè)置的環(huán)境光。建議通過(guò)渲染狀態(tài)設(shè)置一個(gè)整體上的環(huán)境光,對(duì)于場(chǎng)景中的各個(gè)光源不設(shè)置其環(huán)境光屬性,因?yàn)樵谕粋€(gè)場(chǎng)景中,對(duì)于每個(gè)物體其接受到的環(huán)境光應(yīng)當(dāng)相同,所以通過(guò)渲染狀態(tài)設(shè)置一個(gè)整體上的環(huán)境光比較方便,也符合實(shí)際情況。

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


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


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(lèi)(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            久久久久亚洲爆乳少妇无| 97精品依人久久久大香线蕉97| 亚洲AV日韩精品久久久久| 久久精品国产第一区二区三区| 91久久精品国产91性色也| 精品久久久久久无码免费| 欧美激情一区二区久久久| 久久九九兔免费精品6| A狠狠久久蜜臀婷色中文网| 日本久久久久久久久久| 久久精品亚洲日本波多野结衣 | 国产高潮国产高潮久久久91| 久久久久99精品成人片三人毛片 | 精品久久久久久无码专区| 中文字幕久久欲求不满| 久久久久久曰本AV免费免费| 亚洲国产二区三区久久| 久久人爽人人爽人人片AV| 久久精品国产一区二区| 久久亚洲欧美日本精品| 亚洲午夜久久久久久噜噜噜| 日韩AV毛片精品久久久| 久久97久久97精品免视看秋霞 | 久久精品成人一区二区三区| 波多野结衣AV无码久久一区| 久久精品亚洲乱码伦伦中文| 久久久久久综合一区中文字幕| 伊人情人综合成人久久网小说| 国产A级毛片久久久精品毛片| 日韩精品久久久久久久电影蜜臀| 噜噜噜色噜噜噜久久| 久久久黄片| 久久久艹| 久久久精品久久久久特色影视| 久久久久久a亚洲欧洲aⅴ| 国产精品久久久久无码av| 国内精品久久国产大陆| 蜜桃麻豆www久久| 久久99国产精品成人欧美| 久久国产成人午夜AV影院| 精品人妻伦九区久久AAA片69|