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

天行健 君子當自強而不息

坐標系與基本圖元(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>
            国产精品拍天天在线| 欧美波霸影院| 亚洲福利电影| 禁久久精品乱码| 激情av一区二区| 永久域名在线精品| 在线成人激情黄色| 亚洲激情欧美| 亚洲一区二区三区精品动漫| 欧美一区二区视频网站| 另类综合日韩欧美亚洲| 欧美wwwwww| 一二美女精品欧洲| 久久成人精品| 欧美日韩精品伦理作品在线免费观看| 欧美吻胸吃奶大尺度电影| 国产日韩欧美在线视频观看| 亚洲大胆av| 午夜精品国产| 亚洲国产婷婷香蕉久久久久久99 | 国产在线不卡| 亚洲精品久久久一区二区三区| 亚洲欧美激情四射在线日 | 久久久精品国产免大香伊| 暖暖成人免费视频| 国产欧美日韩综合一区在线观看| …久久精品99久久香蕉国产| 亚洲中午字幕| 亚洲国产美女| 久久久久国产精品麻豆ai换脸| 欧美日韩免费一区二区三区视频| 国产一区视频网站| 亚洲一二三区在线| 免费成人av在线| 亚洲一区二区黄| 欧美人成网站| 亚洲精品免费在线| 欧美不卡在线视频| 欧美在线啊v一区| 国产精品v欧美精品v日本精品动漫 | 国产精品大全| 亚洲久久在线| 久久夜色精品| 欧美日本高清视频| 久久久91精品国产| 国产精品毛片大码女人| 在线一区视频| 亚洲三级视频| 欧美高清在线精品一区| 黄色成人av网站| 久久婷婷丁香| 久久久www成人免费无遮挡大片| 国产精品综合不卡av| 亚洲一区二区三区在线观看视频| 亚洲国产日韩欧美| 免费成人性网站| 亚洲黄色高清| 亚洲国产另类久久精品| 欧美日产一区二区三区在线观看 | 久久久久久伊人| 亚洲日本黄色| 欧美激情四色| 一区二区三区日韩在线观看| 亚洲肉体裸体xxxx137| 欧美激情一区二区三区全黄| 日韩午夜剧场| 一区二区免费在线观看| 欧美日韩在线三区| 午夜在线成人av| 欧美伊人精品成人久久综合97| 国外成人性视频| 亚洲国产精品国自产拍av秋霞| 欧美精选在线| 欧美一级夜夜爽| 久久狠狠亚洲综合| 亚洲国产日韩欧美在线动漫| 亚洲国产欧美一区二区三区同亚洲 | 一本色道久久综合亚洲精品高清| 亚洲精品久久久蜜桃| 国产精品a久久久久| 久久成人18免费观看| 久久久视频精品| 一本久久a久久精品亚洲| 国产精品99久久99久久久二8 | 一区二区三区欧美在线| 国产日韩欧美高清免费| 欧美成人在线免费视频| 欧美日韩亚洲在线| 久久免费偷拍视频| 欧美精品久久一区二区| 欧美一级免费视频| 欧美成人午夜影院| 欧美一区国产二区| 欧美成人免费网站| 亚洲在线观看视频| 国产精品视频一| 老鸭窝毛片一区二区三区| 欧美激情一区二区三区在线视频观看 | 久热精品视频| 欧美三级午夜理伦三级中文幕| 久久久99国产精品免费| 欧美色123| 亚洲高清自拍| 国内自拍一区| 亚洲午夜精品在线| 亚洲免费av电影| 久久精品一区二区三区四区 | 好吊色欧美一区二区三区四区| 亚洲精品久久久久中文字幕欢迎你| 国产一区99| 亚洲手机在线| 一区二区三区蜜桃网| 免费视频一区二区三区在线观看| 亚洲欧美一区二区原创| 欧美日本在线观看| 欧美激情中文字幕一区二区| 国内精品久久久久久久97牛牛| 亚洲一区二区在线播放| 亚洲桃花岛网站| 欧美国产在线视频| 免费一级欧美片在线播放| 国产亚洲永久域名| 亚洲欧美日韩精品在线| 亚洲午夜精品| 欧美美女操人视频| 亚洲国产精品久久久久婷婷老年 | 欧美丝袜第一区| 欧美激情乱人伦| 在线免费日韩片| 久久久久久一区二区三区| 久久国产88| 国产在线精品自拍| 欧美在线视频在线播放完整版免费观看 | 亚洲少妇自拍| 欧美久久久久久久久| 亚洲国产精品视频| 亚洲美女毛片| 欧美日韩人人澡狠狠躁视频| 亚洲国产精品精华液2区45| 亚洲人成在线观看网站高清| 麻豆成人av| 亚洲国内自拍| 亚洲视频在线免费观看| 国产精品福利影院| 亚洲欧美在线x视频| 久久综合久久综合这里只有精品| 美女精品视频一区| 国产美女精品| 欧美亚洲综合网| 久久久久国产一区二区三区四区 | 韩日欧美一区二区| 久久久精品日韩欧美| 免费亚洲电影| 一区电影在线观看| 国产精品推荐精品| 久久久精彩视频| 亚洲国产影院| 午夜国产精品视频| 国内精品久久久久国产盗摄免费观看完整版| 欧美影院久久久| 亚洲二区在线视频| 亚洲永久在线观看| 国内精品久久久久伊人av| 久久亚洲捆绑美女| 日韩一级视频免费观看在线| 欧美一区二区视频观看视频| 亚洲国产精品电影在线观看| 欧美激情在线有限公司| 亚洲一区图片| 欧美高清视频一区二区| 亚洲女爱视频在线| 亚洲高清激情| 国产精品欧美日韩一区| 欧美wwwwww| 欧美在线播放| 中文日韩在线| 亚洲成人在线免费| 一本久道久久久| 久久久久久久999精品视频| 亚洲狠狠婷婷| 国产一区在线播放| 欧美日韩国产高清| 久久久欧美精品sm网站| 亚洲一区二区三区精品视频| 欧美黄色网络| 久久久精品2019中文字幕神马| 亚洲免费电影在线| 在线不卡中文字幕| 国产深夜精品| 国产精品国产自产拍高清av王其| 另类天堂视频在线观看| 亚洲女人天堂成人av在线| 亚洲欧洲在线免费| 欧美高清在线视频| 噜噜爱69成人精品| 久久精品成人| 欧美一级在线播放| 午夜精品久久久久久久久| 亚洲视频碰碰| 亚洲天堂视频在线观看|