• <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)而不息

            坐標(biāo)系與基本圖元(6)

            靈活頂點(diǎn)格式

            靈活頂點(diǎn)格式(Flexible Vertex Format, FVF)用來(lái)描述在頂點(diǎn)緩沖區(qū)中的頂點(diǎn)存儲(chǔ)格式中包含了哪些屬性。Direct3D應(yīng)用程序可以用幾種不同的方式定義靈活頂點(diǎn)格式。靈活頂點(diǎn)格式使應(yīng)用程序只使用它需要的頂點(diǎn)數(shù)據(jù),排除那些它不需要的組成成分。這樣,應(yīng)用程序可以節(jié)省內(nèi)存空間,減少系統(tǒng)帶寬。通過(guò)D3DFVF的組合,可以描述圖元頂點(diǎn)的格式。靈活頂點(diǎn)格式指定的格式包括點(diǎn)的大小,用D3DFVF_PSIZE指定,該大小在投影機(jī)空間用來(lái)表示未經(jīng)變換的頂點(diǎn),在設(shè)備空間用來(lái)表示經(jīng)過(guò)變換的頂點(diǎn)。

            接口IDirect3DDevice9的渲染方法能夠接受這些標(biāo)志的組合,并用它們來(lái)決定如何渲染圖元。這些標(biāo)志告訴系統(tǒng)應(yīng)用程序所使用的頂點(diǎn)的組成,包括頂點(diǎn)的位置、頂點(diǎn)混合權(quán)重、法向量、顏色和紋理坐標(biāo)的格式和數(shù)量,以及向Direct3D申請(qǐng)何種渲染流水線。另外,提交或撤銷一個(gè)具體的頂點(diǎn)格式標(biāo)志會(huì)告訴系統(tǒng)哪些頂點(diǎn)組成單元還留在系統(tǒng)中,哪些已經(jīng)被忽略了。

            紋理坐標(biāo)可用不同的格式聲明,紋理可以由一個(gè)坐標(biāo)尋址,也可以由多達(dá)4個(gè)紋理坐標(biāo)來(lái)尋址。使用宏集合D3DFVF_TEXCOORDSIZEn可以創(chuàng)建位模式,定義要使用的頂點(diǎn)格式所需的紋理坐標(biāo)格式。

            為了使用索引頂點(diǎn)混合,標(biāo)志D3DFVF_LASTBETA_UBYTE4應(yīng)該追加到頂點(diǎn)靈活格式中去。這個(gè)標(biāo)志的出現(xiàn)表明第5個(gè)混合權(quán)重將被當(dāng)作一個(gè)DWORD值,而不是一個(gè)浮點(diǎn)值。

             

            渲染狀態(tài)

            設(shè)備渲染狀態(tài)控制Direct3D設(shè)備的光柵化組件的行為。通過(guò)改變渲染狀態(tài)屬性,可以控制使用何種著色模式,如何進(jìn)行霧化及其他光柵化操作。Direct3D編程很大一部分工作就是設(shè)置合適的渲染狀態(tài)。

            Direct3D圖形程序通過(guò)調(diào)用IDirect3DDevice9::SetRenderState()函數(shù)來(lái)設(shè)置渲染狀態(tài)。枚舉類型D3DRENDERSTATETYPE列舉出所有可能的渲染狀態(tài)。應(yīng)用程序?qū)3DRENDERSTATETYPE類型的某一個(gè)枚舉值作為第一個(gè)參數(shù)傳遞給函數(shù)SetRenderState(),然后用第二個(gè)參數(shù)指定相應(yīng)的渲染狀態(tài)。


            著色模式

            Direct3D中的物體表面是由許許多多的多邊形構(gòu)成的。當(dāng)渲染一個(gè)物體的多邊形時(shí),不同的著色模式在其表面產(chǎn)生不同的效果。著色模式?jīng)Q定了多邊形上每個(gè)點(diǎn)的顏色和光照的強(qiáng)度。Direct3D提供兩種著色模式:平面著色模式(FLAT)和戈勞德著色模式(GOURAUD)。

            (1)平面著色模式

            在平面著色模式下,Direct3D渲染一個(gè)多邊形時(shí),把多邊形第一個(gè)頂點(diǎn)的顏色作為整個(gè)多邊形的顏色進(jìn)行著色,也就是說(shuō),在平面著色模式下,一個(gè)多邊形內(nèi)的所有像素的顏色都等于該多邊形第一個(gè)頂點(diǎn)的顏色。如果這些多邊形不共面,用平面著色模式渲染的三維圖形將出現(xiàn)明顯的陡沿。平面著色模式是渲染速度最快的著色模式。

            (2)戈勞德著色模式

            當(dāng)用戈勞德著色渲染一個(gè)多邊形時(shí),它會(huì)先用頂點(diǎn)法向量和燈光參數(shù)計(jì)算每個(gè)頂點(diǎn)的顏色。然后,在該多邊形的表面上進(jìn)行線性插值,進(jìn)而得到每個(gè)像素的顏色。例如,頂點(diǎn)1顏色的紅色值為0.8,頂點(diǎn)2顏色的紅色至為0.4,使用戈勞德著色模式和RGB顏色模式,Direct3D燈光組件將使這兩點(diǎn)連線上中點(diǎn)的顏色的紅色值為0.6。

            (3)著色模式比較

            在平面著色模式中,相鄰兩個(gè)面之間會(huì)有明顯的邊緣,而采用戈勞德著色模式時(shí),邊緣處的著色值會(huì)由內(nèi)插運(yùn)算產(chǎn)生,因而最后會(huì)得到一個(gè)彎曲的表面。在戈勞德著色模式下,對(duì)平面光照的處理要比在平面著色模式下更真實(shí)。在平面著色模式下,一個(gè)面的顏色是唯一的,但戈勞德著色模式可以使光線更準(zhǔn)確地照射在每一個(gè)面上。當(dāng)一個(gè)表面距離一個(gè)點(diǎn)光源很近時(shí),它們的區(qū)別將會(huì)更明顯地表現(xiàn)出來(lái)。

            戈勞德著色模式可以使在平面著色模式下多邊形間的陡沿變得平滑。然而這樣可能會(huì)導(dǎo)致馬赫帶效應(yīng)(Mach bands)的產(chǎn)生,也就是相鄰的顏色或光線帶之間不能很平滑的相互融合。對(duì)于程序開發(fā)人員來(lái)說(shuō),可以通過(guò)增加構(gòu)成對(duì)象的多邊形的數(shù)目來(lái)降低馬赫帶效應(yīng),當(dāng)然也可以通過(guò)提高屏幕分辨率或者增加程序的顏色深度來(lái)達(dá)到目的。

            (4)設(shè)置著色模式

            Direct3D一次只能選擇一種著色模式。默認(rèn)情況下,選擇戈勞德著色模式。在Direct3D圖形程序中,調(diào)用IDirect3DDevice9:: SetRenderState()方法來(lái)改變著色模式。設(shè)置狀態(tài)參數(shù)為D3DRS_SHADEMODE,該狀態(tài)參數(shù)值必須是D3DSHADEMODE枚舉成員的一個(gè)。

            Defines constants that describe the supported shading modes.

            typedef enum D3DSHADEMODE
            {
            D3DSHADE_FLAT = 1,
            D3DSHADE_GOURAUD = 2,
            D3DSHADE_PHONG = 3,
            D3DSHADE_FORCE_DWORD = 0x7fffffff,
            } D3DSHADEMODE, *LPD3DSHADEMODE;

            Constants

            D3DSHADE_FLAT
            Flat shading mode. The color and specular component of the first vertex in the triangle are used to determine the color and specular component of the face. These colors remain constant across the triangle; that is, they are not interpolated. The specular alpha is interpolated. See Remarks.
            D3DSHADE_GOURAUD
            Gouraud shading mode. The color and specular components of the face are determined by a linear interpolation between all three of the triangle's vertices.
            D3DSHADE_PHONG
            Not supported.
            D3DSHADE_FORCE_DWORD
            Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

            Remarks

            The first vertex of a triangle for flat shading mode is defined in the following manner.

            • For a triangle list, the first vertex of the triangle i is i * 3.
            • For a triangle strip, the first vertex of the triangle i is vertex i.
            • For a triangle fan, the first vertex of the triangle i is vertex i + 1.

            The members of this enumerated type define the vales for the D3DRS_SHADEMODE render state.

             

            多邊形填充模式

            默認(rèn)狀態(tài)下,Direct3D會(huì)把渲染好的多邊形面的圖像繪制出來(lái),這種方法適合于絕大多數(shù)情況。然而,有時(shí)為了調(diào)試程序或其他特殊目的,可能只需繪制出多邊形的頂點(diǎn)或邊。這可以通過(guò)設(shè)置渲染狀態(tài)D3DRS_FILLMODE來(lái)實(shí)現(xiàn),通過(guò)為D3DRS_FILLMODE渲染狀態(tài)指定枚舉類型D3DFILLMODE中的一個(gè)數(shù)值,來(lái)選擇多邊形填充模式。

            Defines constants describing the fill mode.

            typedef enum D3DFILLMODE
            {
            D3DFILL_POINT = 1,
            D3DFILL_WIREFRAME = 2,
            D3DFILL_SOLID = 3,
            D3DFILL_FORCE_DWORD = 0x7fffffff,
            } D3DFILLMODE, *LPD3DFILLMODE;

            Constants

            D3DFILL_POINT
            Fill points.
            D3DFILL_WIREFRAME
            Fill wireframes.
            D3DFILL_SOLID
            Fill solids.
            D3DFILL_FORCE_DWORD
            Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

            Remarks

            The values in this enumerated type are used by the D3DRS_FILLMODE render state.

             

            著色模式和填充模式示例程序

            示例程序RenderState演示了著色模式和填充模式對(duì)圖形顯示結(jié)果的影響,在RenderState示例程序中用全局變量g_is_flat和g_fill_mode控制渲染圖形使用的著色模式和填充模式,通過(guò)單擊鼠標(biāo)左鍵在兩種著色模式之間進(jìn)行切換,單擊鼠標(biāo)右鍵在三種填充模式之間進(jìn)行切換。

            Gouraud著色模式

             

            FLAT著色模式

             

            點(diǎn)模式

             

            線模式

             

            完整源代碼:

            #include <d3d9.h>

            #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;
            bool                    g_is_flat    = false;
            DWORD                    g_fill_mode 
            = D3DFILL_SOLID;

            struct sCustomVertex
            {
                
            float x, y, z, rhw;
                DWORD color;
            };

            #define D3DFVF_CUSTOM_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) 

            void init_vertices()
            {
                sCustomVertex vertices[] 
            =
                {
                    { 
            100.0f400.0f0.5f1.0f0xffff0000, },
                    { 
            300.0f,  50.0f0.5f1.0f0xff00ff00, },         
                    { 
            500.0f400.0f0.5f1.0f0xff0000ff, },
                };

                
            // push vertex data into vertex buffer

                g_device
            ->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOM_VERTEX, D3DPOOL_DEFAULT, &g_vertex_buffer, NULL);

                
            void* ptr;

                g_vertex_buffer
            ->Lock(0sizeof(vertices), (void**)&ptr, 0);
                memcpy(ptr, vertices, 
            sizeof(vertices));
                g_vertex_buffer
            ->Unlock();
            }

            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;

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

                init_vertices();

                
            return true;
            }

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

            void render()
            {
                g_device
            ->SetRenderState(D3DRS_SHADEMODE, g_is_flat ? D3DSHADE_FLAT : D3DSHADE_GOURAUD);
                g_device
            ->SetRenderState(D3DRS_FILLMODE,  g_fill_mode);

                g_device
            ->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(555), 1.0f0);    

                g_device
            ->BeginScene();

                g_device
            ->SetStreamSource(0, g_vertex_buffer, 0sizeof(sCustomVertex));
                g_device
            ->SetFVF(D3DFVF_CUSTOM_VERTEX);    
                g_device
            ->DrawPrimitive(D3DPT_TRIANGLELIST, 01);

                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_LBUTTONDOWN:
                    g_is_flat 
            = !g_is_flat;
                    
            break;

                
            case WM_RBUTTONDOWN:
                    
            if(g_fill_mode == D3DFILL_POINT)
                        g_fill_mode 
            = D3DFILL_WIREFRAME;
                    
            else if(g_fill_mode == D3DFILL_WIREFRAME)
                        g_fill_mode 
            = D3DFILL_SOLID;
                    
            else if(g_fill_mode == D3DFILL_SOLID)
                        g_fill_mode 
            = D3DFILL_POINT;

                    
            break;

                
            case WM_KEYDOWN:
                    
            switch(wParam)
                    {    
                    
            case VK_ESCAPE:
                        DestroyWindow(hwnd);
                        
            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, 200100600500,
                                         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;
            }

             

            posted on 2008-05-01 10:17 lovedday 閱讀(1501) 評(píng)論(1)  編輯 收藏 引用

            評(píng)論

            # re: 坐標(biāo)系與基本圖元(6) 2008-07-24 00:16 riki

            很黃很暴力,希望能認(rèn)識(shí)志同道合的朋友  回復(fù)  更多評(píng)論   


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


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

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

            搜索

            最新評(píng)論

            区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 日日躁夜夜躁狠狠久久AV| 中文无码久久精品| 国产成人综合久久久久久| 亚洲性久久久影院| 久久久久夜夜夜精品国产| 思思久久99热免费精品6| 久久香蕉超碰97国产精品| 久久亚洲av无码精品浪潮| 精品人妻久久久久久888| 欧美日韩精品久久久久| 国内精品久久久久久野外| 国产精品99久久久精品无码| 国产精品久久久久aaaa| 热久久最新网站获取| 99久久精品免费国产大片| 性欧美大战久久久久久久久| 久久久精品久久久久久 | 久久久久久久国产免费看| 亚洲∧v久久久无码精品| 久久久久这里只有精品 | 久久这里只有精品久久| 亚洲国产成人乱码精品女人久久久不卡| 2021久久精品国产99国产精品 | 精品999久久久久久中文字幕| 亚洲天堂久久久| 久久这里只有精品视频99| 99久久精品国产一区二区三区| 色综合久久中文字幕无码| 久久青青色综合| 一级a性色生活片久久无少妇一级婬片免费放 | 热RE99久久精品国产66热| 成人a毛片久久免费播放| 精品久久久久久亚洲精品| 亚洲午夜无码久久久久| 久久精品极品盛宴观看| 天天做夜夜做久久做狠狠| 欧美久久一区二区三区| 少妇久久久久久被弄到高潮 | 国产成人精品白浆久久69| 日韩AV无码久久一区二区|