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

            天行健 君子當自強而不息

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

            多光源光照示例程序

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

             

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

             


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

             


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


             

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


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


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


            按下數(shù)字鍵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;
            }

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

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


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

            公告

            導航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評論

            久久精品国产亚洲Aⅴ香蕉| 久久国产精品成人免费| 伊人久久大香线蕉综合5g| 中文字幕日本人妻久久久免费| 亚洲欧美伊人久久综合一区二区| 久久久久久国产精品免费无码 | 久久国语露脸国产精品电影 | 久久综合综合久久狠狠狠97色88 | 合区精品久久久中文字幕一区| 亚洲香蕉网久久综合影视| 99久久精品费精品国产 | 久久精品国产99国产电影网| 久久99精品免费一区二区| 日日噜噜夜夜狠狠久久丁香五月| 很黄很污的网站久久mimi色| 久久久国产乱子伦精品作者| 伊人久久大香线蕉AV一区二区| 久久66热人妻偷产精品9| 色狠狠久久综合网| 国产综合成人久久大片91| 久久精品国产清高在天天线| 中文字幕无码久久精品青草| 伊人久久大香线焦综合四虎| 久久发布国产伦子伦精品| 亚洲伊人久久综合中文成人网| 狠狠久久亚洲欧美专区| 欧美一区二区三区久久综合| 国内精品久久久久影院亚洲| 日批日出水久久亚洲精品tv| 精品久久久久久国产牛牛app| 精品熟女少妇av免费久久| 国内精品综合久久久40p| 久久综合亚洲色HEZYO国产| 久久久久国产一区二区| 国产精品va久久久久久久| 国产精品一区二区久久精品| 2022年国产精品久久久久| 久久精品无码专区免费青青| 久久精品人人做人人妻人人玩| 日韩人妻无码精品久久久不卡| 亚洲午夜久久久久久久久电影网 |