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

天行健 君子當自強而不息

坐標系與基本圖元(6)

靈活頂點格式

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

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

紋理坐標可用不同的格式聲明,紋理可以由一個坐標尋址,也可以由多達4個紋理坐標來尋址。使用宏集合D3DFVF_TEXCOORDSIZEn可以創(chuàng)建位模式,定義要使用的頂點格式所需的紋理坐標格式。

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

 

渲染狀態(tài)

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

Direct3D圖形程序通過調用IDirect3DDevice9::SetRenderState()函數(shù)來設置渲染狀態(tài)。枚舉類型D3DRENDERSTATETYPE列舉出所有可能的渲染狀態(tài)。應用程序將D3DRENDERSTATETYPE類型的某一個枚舉值作為第一個參數(shù)傳遞給函數(shù)SetRenderState(),然后用第二個參數(shù)指定相應的渲染狀態(tài)。


著色模式

Direct3D中的物體表面是由許許多多的多邊形構成的。當渲染一個物體的多邊形時,不同的著色模式在其表面產生不同的效果。著色模式決定了多邊形上每個點的顏色和光照的強度。Direct3D提供兩種著色模式:平面著色模式(FLAT)和戈勞德著色模式(GOURAUD)。

(1)平面著色模式

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

(2)戈勞德著色模式

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

(3)著色模式比較

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

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

(4)設置著色模式

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

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.

 

多邊形填充模式

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

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演示了著色模式和填充模式對圖形顯示結果的影響,在RenderState示例程序中用全局變量g_is_flat和g_fill_mode控制渲染圖形使用的著色模式和填充模式,通過單擊鼠標左鍵在兩種著色模式之間進行切換,單擊鼠標右鍵在三種填充模式之間進行切換。

Gouraud著色模式

 

FLAT著色模式

 

點模式

 

線模式

 

完整源代碼:

#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 閱讀(1514) 評論(1)  編輯 收藏 引用

評論

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

很黃很暴力,希望能認識志同道合的朋友  回復  更多評論   


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


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(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>
            巨胸喷奶水www久久久免费动漫| 久久一区二区三区四区| 午夜久久tv| 午夜精品久久久久99热蜜桃导演| 国产精品视频精品视频| 欧美专区在线观看| 久久视频在线看| 猛男gaygay欧美视频| 欧美激情一二区| 国产精品网曝门| 国内精品久久久久久| 亚洲国产毛片完整版| 一区二区三区日韩| 久久激情久久| 亚洲第一色在线| 在线亚洲+欧美+日本专区| 亚洲欧美美女| 免费高清在线一区| 国产精品日韩一区二区| 亚洲高清久久网| 久久av一区二区三区| 欧美成人一区在线| 亚洲一区二区三区四区中文 | 欧美在线观看视频一区二区三区| 国产一区二区三区免费观看 | 亚洲男人第一网站| 久久久久久久久综合| 欧美日韩一区免费| 亚洲第一区中文99精品| 午夜一级在线看亚洲| 欧美激情第六页| 午夜精品区一区二区三| 欧美xxxx在线观看| 精久久久久久| 欧美一区二区三区在线观看视频| 亚洲欧美视频在线观看| 欧美xxx在线观看| 亚洲欧美日韩精品综合在线观看| 最新成人av网站| 午夜天堂精品久久久久| 欧美精品一区在线播放| 激情久久久久久| 午夜精品久久久久99热蜜桃导演| 亚洲手机在线| 欧美国产专区| 美女任你摸久久| 国语自产偷拍精品视频偷| 亚洲欧美一区二区原创| 亚洲国产小视频| 免费不卡中文字幕视频| 亚洲第一天堂av| 噜噜噜躁狠狠躁狠狠精品视频| 麻豆精品精华液| 欧美影院在线| 国产一区二区丝袜高跟鞋图片| 裸体一区二区三区| 亚洲第一精品福利| 亚洲免费在线观看| 99精品福利视频| 欧美寡妇偷汉性猛交| 亚洲国产日韩一区| 亚洲二区在线| 欧美日韩精品一区二区三区| 在线亚洲伦理| 亚洲在线视频观看| 国产亚洲精品一区二555| 久久久久久91香蕉国产| 欧美综合77777色婷婷| 在线精品视频一区二区| 亚洲国产日韩在线| 欧美日韩美女一区二区| 亚洲在线一区二区三区| 在线亚洲自拍| 国产日韩精品一区二区三区在线| 亚洲黄色在线| 亚洲欧洲在线观看| 国产精品另类一区| 久久综合狠狠综合久久激情| 欧美成人精品激情在线观看| 中文无字幕一区二区三区| 亚洲午夜精品久久久久久浪潮 | 国产欧美日本一区二区三区| 99在线精品免费视频九九视| 正在播放欧美视频| 韩国av一区二区三区四区| 欧美成人国产| 国产精品久久久久久亚洲毛片| 亚洲国产精品欧美一二99| 欧美二区视频| 欧美私人网站| 麻豆精品网站| 欧美日韩一区二区欧美激情| 久久精品动漫| 欧美精品久久一区二区| 久久成人在线| 欧美电影免费观看| 久久精品国产亚洲a| 欧美精品麻豆| 久久婷婷综合激情| 欧美日韩久久久久久| 久久久久欧美精品| 欧美日韩国产精品自在自线| 久久精品综合| 国产精品日韩精品欧美精品| 亚洲国产日韩一区| 狠狠网亚洲精品| 中国亚洲黄色| aⅴ色国产欧美| 久久手机精品视频| 久久国产精品99国产| 欧美福利视频| 亚洲欧美一区二区视频| 欧美激情亚洲自拍| 久久在线免费| 国产日韩欧美在线一区| 在线观看国产成人av片| 美女国产一区| 国产欧美日韩一区| 一区二区高清视频| 欧美一区二区三区在| 亚洲欧美成人一区二区在线电影 | 久久一二三四| 西西裸体人体做爰大胆久久久| 一区二区三区视频在线| 亚洲第一网站| 久久手机精品视频| 另类天堂av| 在线精品国精品国产尤物884a| 免费成人av在线看| 国产精品日本一区二区| 一本色道婷婷久久欧美| 99xxxx成人网| 欧美人成在线视频| 亚洲人成在线播放网站岛国| 亚洲美女黄色| 欧美日韩一区免费| 中日韩美女免费视频网站在线观看| 国产精品国产三级国产专区53| 亚洲在线视频观看| 欧美日本国产一区| 亚洲另类一区二区| 一区二区三区欧美激情| 欧美日韩美女一区二区| 中文日韩电影网站| 欧美影院视频| 极品日韩av| 欧美人与禽性xxxxx杂性| 日韩视频免费在线观看| 亚洲欧美中日韩| 国产自产v一区二区三区c| 久久一区二区三区国产精品| 欧美激情第二页| 亚洲午夜一区二区三区| 国产精品国产三级国产专区53 | 欧美日韩免费观看一区三区| 亚洲日本激情| 亚洲一区二区三区四区中文| 国产精品区一区二区三区| 欧美一级在线播放| 欧美成人综合一区| 在线综合+亚洲+欧美中文字幕| 久久成人18免费网站| 久久夜色精品亚洲噜噜国产mv| 欧美日韩亚洲一区二区三区四区| 久久大综合网| 亚洲国产精品999| 欧美婷婷六月丁香综合色| 欧美在线www| 亚洲激情一区| 久久久噜噜噜久久久| 亚洲狼人综合| 国产一区二区三区丝袜| 欧美精品一区二区三区在线播放 | 麻豆精品国产91久久久久久| 在线欧美日韩| 亚洲午夜久久久久久尤物 | 久久精品亚洲| 亚洲高清视频在线观看| 国产精品免费电影| 蜜臀av一级做a爰片久久| 亚洲曰本av电影| 亚洲国产天堂久久综合网| 久久国产精品电影| 亚洲最新中文字幕| 影音先锋日韩精品| 国产精品亚洲综合天堂夜夜| 久久婷婷成人综合色| 亚洲午夜激情网站| 最新国产乱人伦偷精品免费网站| 亚洲国产另类久久精品| 国产精品毛片在线看| 欧美另类变人与禽xxxxx| 欧美在线电影| 亚洲欧美日韩一区在线| 日韩一二在线观看| 亚洲免费黄色| 亚洲日本欧美| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲精品欧洲精品| 国产欧美精品一区|