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

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

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

靈活頂點格式

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

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

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

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

 

渲染狀態(tài)

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

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


著色模式

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

(1)平面著色模式

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

(2)戈勞德著色模式

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

(3)著色模式比較

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

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

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

Direct3D一次只能選擇一種著色模式。默認(rèn)情況下,選擇戈勞德著色模式。在Direct3D圖形程序中,調(diào)用IDirect3DDevice9:: SetRenderState()方法來改變著色模式。設(shè)置狀態(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.

 

多邊形填充模式

默認(rèn)狀態(tài)下,Direct3D會把渲染好的多邊形面的圖像繪制出來,這種方法適合于絕大多數(shù)情況。然而,有時為了調(diào)試程序或其他特殊目的,可能只需繪制出多邊形的頂點或邊。這可以通過設(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演示了著色模式和填充模式對圖形顯示結(jié)果的影響,在RenderState示例程序中用全局變量g_is_flat和g_fill_mode控制渲染圖形使用的著色模式和填充模式,通過單擊鼠標(biāo)左鍵在兩種著色模式之間進行切換,單擊鼠標(biāo)右鍵在三種填充模式之間進行切換。

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: 坐標(biāo)系與基本圖元(6) 2008-07-24 00:16 riki

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


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


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

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

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩另类丝袜其他| 韩国三级电影久久久久久| 一本久道久久综合狠狠爱| 亚洲国产精品悠悠久久琪琪| 中文网丁香综合网| 宅男66日本亚洲欧美视频 | 国产日韩欧美综合| 国产精品试看| 国产一在线精品一区在线观看| 国内精品伊人久久久久av一坑| 精品成人在线| 日韩亚洲不卡在线| 午夜精品视频在线| 蜜桃av一区二区三区| 亚洲日本理论电影| 欧美一区二区视频观看视频| 久久精品中文| 欧美另类变人与禽xxxxx| 国产精品毛片va一区二区三区| 国产日韩欧美综合| 亚洲精品日日夜夜| 久久国产99| 亚洲国产视频直播| 亚洲一区二区三| 可以免费看不卡的av网站| 欧美日韩八区| 狠狠色丁香婷综合久久| 国产精品a久久久久久| 精品成人免费| 欧美成人免费网| 国产精品白丝av嫩草影院| 国产精品视频精品| 91久久精品日日躁夜夜躁欧美| 亚洲香蕉成视频在线观看| 老司机午夜免费精品视频 | 亚洲一区二区3| 噜噜噜噜噜久久久久久91| 国产精品电影网站| 亚洲国产精品久久久久婷婷884| 亚洲一区二区视频| 欧美福利电影网| 欧美在线视频二区| 国产精品福利在线| 亚洲午夜羞羞片| 亚洲日韩中文字幕在线播放| 玖玖精品视频| 亚洲国产片色| 亚洲第一精品电影| 欧美大胆人体视频| 亚洲免费观看| 亚洲精品国产精品乱码不99按摩| 久久人人看视频| 亚洲国产精品一区| 亚洲国产99精品国自产| 美日韩在线观看| 亚洲美女黄色| 亚洲美女av黄| 欧美调教vk| 欧美一区二区三区久久精品茉莉花| 亚洲精品综合久久中文字幕| 欧美成年人网| 99日韩精品| 亚洲亚洲精品三区日韩精品在线视频| 欧美性感一类影片在线播放 | 看欧美日韩国产| 最新成人在线| 亚洲电影在线看| 欧美精品99| 亚洲综合成人婷婷小说| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲砖区区免费| 国产精品国产三级国产普通话99| 亚洲美女黄色| 亚洲美女色禁图| 欧美日本高清视频| 亚洲精品在线一区二区| 欧美激情第1页| 欧美一区二区三区四区视频| 午夜精品三级视频福利| 黑人一区二区三区四区五区| 亚洲综合色噜噜狠狠| 亚洲欧美成人在线| 久久一本综合频道| 国内精品免费在线观看| 亚洲精品之草原avav久久| 一本久道综合久久精品| 久久久久久久激情视频| 99这里只有精品| 欧美+亚洲+精品+三区| 欧美日本一区| 亚洲精品乱码视频 | 欧美无乱码久久久免费午夜一区| 亚洲一区在线观看视频 | 欧美/亚洲一区| 亚洲视频在线观看网站| 美女精品在线| 国产精品视频免费观看www| 亚洲精品自在久久| 欧美一区二区国产| 国产精品久久久91| 欧美成人精品一区二区| 欧美亚洲综合在线| 中文av字幕一区| 亚洲三级电影在线观看 | 欧美日本国产视频| 久久久久久自在自线| 亚洲图片在线| 亚洲精品午夜精品| 亚洲国产一区二区a毛片| 国内外成人免费激情在线视频网站 | 国产精品日日摸夜夜添夜夜av| 在线综合亚洲欧美在线视频| 亚洲乱码国产乱码精品精可以看| 国产精品视频免费一区| 亚洲精品黄网在线观看| 欧美主播一区二区三区| 免费成人高清视频| 久久综合伊人77777尤物| 亚洲欧美日韩天堂一区二区| 欧美91大片| 欧美寡妇偷汉性猛交| 裸体女人亚洲精品一区| 欧美jizz19hd性欧美| 欧美视频官网| 欧美在线综合视频| 国产欧美日韩一级| 一区二区三区久久久| 夜久久久久久| 欧美激情va永久在线播放| 亚洲专区一二三| 国产精品mm| 欧美在线免费| 国产日产精品一区二区三区四区的观看方式| 亚洲综合精品四区| 亚洲线精品一区二区三区八戒| 欧美视频久久| 宅男精品视频| 国产麻豆精品theporn| 一本大道久久精品懂色aⅴ| 国产精品福利片| 亚洲视频中文| 在线免费一区三区| 久久中文字幕导航| 亚洲视频二区| 国产精品va在线播放| 久久综合中文色婷婷| 在线观看欧美黄色| 亚洲欧美日韩中文播放| 欧美三级韩国三级日本三斤| 亚洲精品在线观看视频| 欧美日韩亚洲高清一区二区| 亚洲欧洲日产国产网站| 欧美日韩国产限制| 在线综合亚洲欧美在线视频| 欧美午夜精品久久久久久人妖 | 亚洲精品久久久一区二区三区| 一区二区三区日韩精品视频| 亚洲欧美日韩综合一区| 欧美高清自拍一区| 国产日本欧洲亚洲| 欧美激情网站在线观看| 久久国产主播精品| 亚洲国产精品久久久| 91久久久在线| 欧美成人xxx| 猫咪成人在线观看| 欧美韩日亚洲| 国产欧美精品一区二区三区介绍| 中文av一区特黄| 一区二区三区av| 国产欧美日韩专区发布| 一区二区成人精品| 另类综合日韩欧美亚洲| 国产精品一区久久| 欧美国产第二页| 欧美黄色网络| 国内外成人在线视频| 亚洲视频一二| 91久久夜色精品国产九色| 国产欧美短视频| 久久综合五月| 国产综合色在线| 欧美亚洲成人精品| 久久久久久久久久久久久女国产乱 | 国产精品一区二区三区乱码| 欧美国产先锋| 亚洲二区免费| 另类亚洲自拍| 国产伊人精品| 久久激情综合网| 每日更新成人在线视频| 狠狠色丁香久久婷婷综合丁香| 99综合精品| 午夜在线一区二区| 国产日韩欧美一区| 久久久久久久久蜜桃| 国内精品久久久久影院优| 性欧美xxxx视频在线观看| 久久久久久穴| 狠狠色丁香婷婷综合久久片|