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

天行健 君子當自強而不息

Direct3D中的繪制(2)

3.2 渲染狀態

Direct3D提供了多種渲染狀態,它影響幾何物體怎樣被渲染。渲染狀態有默認值,因此假如你的應用程序需要不同于默認設置的渲染時,你僅僅改變它即可。一種渲染效果會一直起作用,直到你下一次改變渲染狀態為止。為了設置一個渲染狀態,我們使用下面的方法:

Sets a single device render-state parameter.

HRESULT SetRenderState(
D3DRENDERSTATETYPE State,
DWORD Value
);

Parameters

State
[in] Device state variable that is being modified. This parameter can be any member of the D3DRENDERSTATETYPE enumerated type.
Value
[in] New value for the device render state to be set. The meaning of this parameter is dependent on the value specified for State. For example, if State were D3DRS_SHADEMODE, the second parameter would be one member of the D3DSHADEMODE enumerated type.

Return Values

If the method succeeds, the return value is D3D_OK. D3DERR_INVALIDCALL is returned if one of the arguments is invalid.

 

例如,在下面的例子中我們將使用線框模式渲染我們的物體。因此,我們設置如下的渲染狀態:

_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

注意:查看DirectX SDK中關于D3DRENDERSTATETYPE的信息。其中詳細介紹了所有的渲染狀態。

 

3.3 繪制準備

一旦我們創建好一個頂點緩存以及一個索引緩存(可選的)后,我們就為渲染其中的內容準備得差不多了,但是在渲染前我們還有3個步驟必須先做。

1、 設置資源流。設置資源流與一個頂點緩存掛鉤,此流就是一個流入渲染管線的幾何信息的流。

下面的方法是用于設置一個資源流:

HRESULT IDirect3DDevice9::SetStreamSource(

       UINT StreamNumber,

       IDirect3DVertexBuffer9* pStreamData,

       UINT OffsetInBytes,

       UINT Stride

);

StreamNumber——確定我們的頂點緩存與哪一個資源流掛鉤。我們不使用多重流;因此我們總是使用0號流。

pStreamData——一個指向我們想與流掛鉤的那個頂點緩存的指針。

OffsetInBytes——相對流開始處的偏移量。以字節為單位,它指定被填入渲染管線的頂點數據的開始位置。通過檢查D3DCAPS9結構中的D3DDEVCAPS2_STREAMOFFSET標志,假如你的設備支持,那么這個參數就有一些非0值。

Stride——我們在頂點緩存中操作的每個部分的流的字節大小。

例如,假設vb是一個已經填充了頂點信息的頂點緩存:

_device->SetStreamSource( 0, vb, 0, sizeof( Vertex ) );

 

2、 設置索引緩存。假如我們使用了索引緩存,我們必須設置后面要用于繪制操作的索引緩存。每次我們只能使用一個索引緩存;因此假如你需要用一個不同的索引緩存繪制一個物體時,你必須轉換到另一個上。下面的代碼設置一個索引緩存:

_device->SetIndices( _ib ); // 傳遞一個索引緩存指針的拷貝

 

3.4用頂點/索引緩存繪制

在我們創建好頂點/索引緩存以及做好準備工作以后,我們就能繪制我們的幾何物體了。這是通過使用DrawPrimitive或者DrawIndexedPrimitive傳送幾何信息到達渲染管線。這些方法從頂點流中獲得頂點信息以及從索引緩存中獲得索引信息。

 

3.4.1 IDirect3DDevice9::DrawPrimitive

這個方法不使用索引信息繪制圖元。

HRESULT IDirect3DDevice9::DrawPrimitive(

       D3DPRIMITIVETYPE PrimitiveType,

       UINT StartVertex,

       UINT PrimitiveCount

);

PrimitiveType——我們繪制的圖元類型。比如,我們能繪制點和線以及三角形。以后我們使用三角形,用D3DPT_TRIANGLELIST參數。

StartVertex——索引到在頂點流中的一個元素。設置渲染頂點中的開始點。這個參數給予我們一定的機動性,可以繪制一個頂點緩存中的某部分。

PrimitiveCount——繪制圖元的個數。

例子:

// 繪制4個三角形

_device->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 4);

 

Renders a sequence of nonindexed, geometric primitives of the specified type from the current set of data input streams.

HRESULT DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex,
UINT PrimitiveCount
);

Parameters

PrimitiveType
[in] Member of the D3DPRIMITIVETYPE enumerated type, describing the type of primitive to render.
StartVertex
[in] Index of the first vertex to load. Beginning at StartVertex the correct number of vertices will be read out of the vertex buffer.
PrimitiveCount
[in] Number of primitives to render. The maximum number of primitives allowed is determined by checking the MaxPrimitiveCount member of the D3DCAPS9 structure. PrimitiveCount is the number of primitives as determined by the primitive type. If it is a line list, each primitive has two vertices. If it is a triangle list, each primitive has three vertices.

Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

Remarks

When converting a legacy application to Direct3D 9, you must add a call to either IDirect3DDevice9::SetFVF to use the fixed function pipeline, or IDirect3DDevice9::SetVertexDeclaration to use a vertex shader before you make any Draw calls.

Defines the primitives supported by Direct3D.

typedef enum D3DPRIMITIVETYPE
{
D3DPT_POINTLIST = 1,
D3DPT_LINELIST = 2,
D3DPT_LINESTRIP = 3,
D3DPT_TRIANGLELIST = 4,
D3DPT_TRIANGLESTRIP = 5,
D3DPT_TRIANGLEFAN = 6,
D3DPT_FORCE_DWORD = 0x7fffffff,
} D3DPRIMITIVETYPE, *LPD3DPRIMITIVETYPE;

Constants

D3DPT_POINTLIST
Renders the vertices as a collection of isolated points. This value is unsupported for indexed primitives.
D3DPT_LINELIST
Renders the vertices as a list of isolated straight line segments.
D3DPT_LINESTRIP
Renders the vertices as a single polyline.
D3DPT_TRIANGLELIST

Renders the specified vertices as a sequence of isolated triangles. Each group of three vertices defines a separate triangle.

Back-face culling is affected by the current winding-order render state.

 

D3DPT_TRIANGLESTRIP
Renders the vertices as a triangle strip. The backface-culling flag is automatically flipped on even-numbered triangles.
D3DPT_TRIANGLEFAN
Renders the vertices as a triangle fan.
D3DPT_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

Using Triangle Strips (Direct3D 9) or Triangle Fans (Direct3D 9) is often more efficient than using triangle lists because fewer vertices are duplicated.

3.4.2 IDirect3DDevice9::DrawIndexedPrimitive

這個方法使用索引信息來繪制圖元。

HRESULT IDirect3DDevice9::DrawIndexedPrimitive(

       D3DPRIMITIVETYPE Type,

       INT BaseVertexIndex,

       UINT MinIndex,

       UINT NumVertices,

       UINT StartIndex,

       UINT PrimitiveCount

);

Type——我們繪制的圖元類型。比如,我們能繪制點和線以及三角形。以后我們使用三角形,用D3DPT_TRIANGLELIST參數。

BaseVertexIndex——一個基本數字,在調用中用它去加上索引。參看下面的說明。

MinIndex——將被引用的最小索引值。

NumVertices——在此調用中將被引用的頂點數。

StartIndex——索引到索引緩存中的某個位置,它標記開始渲染的開始索引點。

PrimitiveCount——繪制圖元的個數。

例子:

_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);

 

注意:BaseVertexIndex參數需要一些特別的解釋。在解釋過程中將會用到的圖3.2。

 

在索引緩存中定位頂點相應的也就在頂點緩存中定位了。然而,假設我們想將球,盒子,圓柱體的頂點放置到一個公共的頂點緩存中。對于每一個物體,我們將不得不再計算在公共頂點緩存中的索引。這個新的索引值是通過與一個偏移量相加得到。注意這個偏移量是標準的頂點,而不是字節。

       我們需要計算物體在公共頂點緩存中的索引值。Direct3D允許我們通過設置BaseVertexIndex參數得到一個頂點偏移量,隨后Direct3D就能利用頂點自身的索引重新計算新的索引。

 

3.4.3 開始/結束場景

最后一點就是所有繪制方法都必須在IDirect3DDevice9::BeginScene和IDirect3DDevice9::EndScene方法之間被調用。例如,我們將這樣寫:

_device->BeginScene();

// 繪制場景

_device->DrawPrimitive(...);

_device->EndScene();

 

3.5 D3DX幾何物體

通過在代碼中建造每個三角形來建造3D物體是一件非常枯燥的事。幸運的是,D3DX庫已經為我們提供了一些方法來產生簡單3D物體的網格數據。

D3DX庫提供如下6種網格生成函數。

D3DXCreateBox

D3DXCreateSphere

D3DXCreateCylinder

D3DXCreateTeapot

D3DXCreatePolygon

D3DXCreateTorus

這6種函數的使用都很類似,并且使用D3DX網格數據結構ID3DXMesh就象使用ID3DXBuffer接口一樣。現在,我們忽視它們的詳細信息,只需簡單使用它們即可。

HRESULT D3DXCreateTeapot(

       LPDIRECT3DDEVICE9 pDevice, // 與mesh關聯的設備

       LPD3DXMESH* ppMesh, // 返回的mesh

       LPD3DXBUFFER* ppAdjacency // 現在設成0

);

 

一個使用D3DXCreateTeapot函數的例子:

ID3DXMesh* mesh = 0;

D3DXCreateTeapot(_device, &mesh, 0);

一旦生成了網格數據,我們就能使用ID3DXMesh::DrawSubset方法繪制圖形了。這個方法有一個參數,它用來識別網格的一個子集。這個網格是通過上面的D3DXCreate*函數中的一個子集創建的,因此可以給這個參數指定0值。一個渲染網格的例子:

_device->BeginScene();

       mesh->DrawSubset(0);

_device->EndScene();

 

使用了網格以后,必須釋放(release)它:

mesh->Release();

_mesh = 0;

 

 

 實例程序:三角形

這是非常簡單的應用程序,它示范了在線框模式下怎樣創建并渲染一個三角形。

/**************************************************************************************
  Renders a triangle in wireframe mode.  
  Demonstrates vertex buffers, render states, and drawing commands.
 *************************************************************************************
*/

#include 
"d3dUtility.h"

#pragma warning(disable : 
4100)

const int WIDTH  = 640;
const int HEIGHT = 480;

IDirect3DDevice9
*        g_d3d_device  = NULL;
IDirect3DVertexBuffer9
*    g_triangle_vb = NULL;

class cVertex
{
public:
    
float m_x, m_y, m_z;

    cVertex() {}

    cVertex(
float x, float y, float z)
    {
        m_x 
= x;
        m_y 
= y;
        m_z 
= z;
    }
};

const DWORD VERTEX_FVF = D3DFVF_XYZ;

////////////////////////////////////////////////////////////////////////////////////////////////////

bool setup()
{    
    g_d3d_device
->CreateVertexBuffer(3 * sizeof(cVertex), D3DUSAGE_WRITEONLY, VERTEX_FVF, 
                                     D3DPOOL_MANAGED, 
&g_triangle_vb, NULL);

    
// fill the buffers with the triangle data
    cVertex* vertices;
    g_triangle_vb
->Lock(00, (void**)&vertices, 0);
    
    vertices[
0= cVertex(-1.0f0.0f2.0f);
    vertices[
1= cVertex( 0.0f1.0f2.0f);
    vertices[
2= cVertex( 1.0f0.0f2.0f);

    g_triangle_vb
->Unlock();

    
// set the projection matrix
    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
&proj, D3DX_PI * 0.5f, (float)WIDTH/HEIGHT, 1.0f1000.0f);
    g_d3d_device
->SetTransform(D3DTS_PROJECTION, &proj);

    
// set wireframe mode render state
    g_d3d_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

    
return true;
}

void cleanup()
{
    safe_release
<IDirect3DVertexBuffer9*>(g_triangle_vb);
}

bool display(float time_delta)
{
    g_d3d_device
->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff1.0f0);

    g_d3d_device
->BeginScene();

    g_d3d_device
->SetStreamSource(0, g_triangle_vb, 0sizeof(cVertex));
    g_d3d_device
->SetFVF(VERTEX_FVF);

    
// draw one triangle
    g_d3d_device->DrawPrimitive(D3DPT_TRIANGLELIST, 01);

    g_d3d_device
->EndScene();

    g_d3d_device
->Present(NULL, NULL, NULL, NULL);

    
return true;
}

LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
{
    
switch(msg)
    {
    
case WM_DESTROY:
        PostQuitMessage(
0);
        
break;

    
case WM_KEYDOWN:
        
if(word_param == VK_ESCAPE)
            DestroyWindow(hwnd);
        
break;
    }

    
return DefWindowProc(hwnd, msg, word_param, long_param);
}

int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
{
    
if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_d3d_device))
    {
        MessageBox(NULL, 
"init_d3d() - failed."0, MB_OK);
        
return 0;
    }

    
if(! setup())
    {
        MessageBox(NULL, 
"Steup() - failed."0, MB_OK);
        
return 0;
    }

    enter_msg_loop(display);

    cleanup();
    g_d3d_device
->Release();

    
return 0;
}

 


截圖:


下載三角形源程序


posted on 2008-03-14 13:00 lovedday 閱讀(1297) 評論(0)  編輯 收藏 引用


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


公告

導航

統計

常用鏈接

隨筆分類(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>
            国产女主播一区二区三区| 亚洲国产精品一区二区尤物区| 亚洲七七久久综合桃花剧情介绍| 久久久久久久久综合| 性感少妇一区| 欧美在线综合视频| 欧美一区二区视频在线观看2020 | 欧美涩涩网站| 国产精品美女一区二区| 国产精品久久二区| 国产一区二区三区久久悠悠色av| 黄色亚洲免费| 91久久黄色| 亚洲影视九九影院在线观看| 亚洲综合电影| 免费久久99精品国产| 亚洲国产高潮在线观看| 亚洲网站视频| 麻豆久久精品| 国产精品久久久久久久9999| 国产一区二区三区直播精品电影 | 欧美在线视频二区| 香蕉久久国产| 久久精品国产在热久久| 蜜桃精品久久久久久久免费影院| 欧美日韩免费在线| 激情综合色综合久久综合| 亚洲精品小视频| 久久精品国产在热久久| 亚洲精品极品| 榴莲视频成人在线观看| 国产精品一区=区| 亚洲精品在线观| 久久久免费观看视频| 亚洲精品中文字幕在线| 久久精品成人一区二区三区蜜臀| 欧美激情一区二区三区全黄| 国产日韩欧美亚洲一区| 中国女人久久久| 你懂的国产精品| 欧美一区二区视频免费观看| 欧美日韩四区| 一本色道久久综合| 亚洲国产精品第一区二区| 久久精品国产综合精品| 国产欧美精品日韩精品| 宅男噜噜噜66一区二区| 亚洲国产欧美一区二区三区久久| 久久福利电影| 狠狠久久综合婷婷不卡| 欧美一区二区黄色| 在线一区欧美| 欧美午夜一区二区福利视频| 一区二区三区四区国产| 亚洲精品国产精品国自产在线| 老司机成人网| 亚洲韩国日本中文字幕| 欧美成人免费全部| 理论片一区二区在线| 伊人成人开心激情综合网| 久久免费少妇高潮久久精品99| 亚洲自拍三区| 国产日韩专区在线| 久久综合久久久久88| 久久综合国产精品| 亚洲欧洲免费视频| 亚洲激情视频网站| 欧美人与性动交a欧美精品| 亚洲免费观看| 一区二区三区福利| 国产美女精品免费电影| 欧美影院精品一区| 久久精品卡一| 99精品视频一区二区三区| 99ri日韩精品视频| 国产欧美日韩综合一区在线观看| 久久久久综合一区二区三区| 久久综合网络一区二区| 日韩一区二区高清| 亚洲免费网站| 亚洲大片免费看| 久久免费视频这里只有精品| 久久蜜桃香蕉精品一区二区三区| 中日韩午夜理伦电影免费| 国产精品超碰97尤物18| 亚洲欧美日韩一区在线观看| 亚洲男人的天堂在线| 激情一区二区三区| 91久久精品国产91性色| 国产精品爱久久久久久久| 久久久精品一区| 欧美激情一区二区三区高清视频 | 国产精品欧美日韩| 久久亚洲国产成人| 欧美日韩爆操| 久久资源在线| 欧美性猛交一区二区三区精品| 久久xxxx| 欧美日本国产视频| 久久免费高清| 国产精品久久久久一区二区| 麻豆精品视频在线观看| 国产精品精品视频| 亚洲第一精品影视| 国产亚洲永久域名| 一本色道久久综合| 最新69国产成人精品视频免费| 亚洲天堂久久| 一本色道久久综合亚洲91| 久久精品在线| 欧美一区二区视频97| 欧美日韩一区二区三区免费看| 另类欧美日韩国产在线| 国产精品乱人伦中文| 亚洲激情在线| 亚洲精品九九| 麻豆成人综合网| 玖玖综合伊人| 国内精品免费午夜毛片| 亚洲午夜av电影| 亚洲一卡二卡三卡四卡五卡| 欧美电影在线观看| 欧美www视频| 极品少妇一区二区| 久久国产欧美精品| 久久久噜噜噜久久中文字免| 国产麻豆成人精品| 午夜精品久久久久久久| 亚洲欧美日本视频在线观看| 欧美日韩国产综合新一区| 亚洲黄色大片| 99精品欧美一区二区三区综合在线 | 久久亚洲精品一区二区| 国产欧美日韩视频一区二区| 在线一区二区三区四区| 亚洲淫片在线视频| 国产精品免费区二区三区观看| 国产精品99久久久久久www| 亚洲一区久久久| 国产精品嫩草影院一区二区| 亚洲性夜色噜噜噜7777| 久久精品视频网| 亚洲欧美在线磁力| 国产精品社区| 午夜在线精品| 老司机久久99久久精品播放免费 | 欧美一区二区三区婷婷月色| 久久国内精品自在自线400部| 国产模特精品视频久久久久| 欧美一区二区三区成人| 久久综合久久综合这里只有精品 | 亚洲人成精品久久久久| 一本色道婷婷久久欧美| 国产精品高潮呻吟久久av黑人| 亚洲一本视频| 久热国产精品| 日韩午夜在线播放| 国产精品女主播| 久久久久久久久久久久久9999| 欧美激情视频一区二区三区在线播放 | 久久综合色天天久久综合图片| 在线观看欧美日本| 欧美另类一区二区三区| 亚洲欧美日韩一区二区三区在线观看| 久久久精品网| 99热精品在线观看| 国产精品视频久久| 久久中文久久字幕| 一本色道久久综合亚洲精品婷婷| 久久爱www久久做| 日韩午夜电影| 好吊一区二区三区| 欧美午夜视频网站| 乱码第一页成人| 亚洲制服丝袜在线| 亚洲人成在线观看一区二区| 欧美影院久久久| 一区二区三区视频观看| 激情欧美一区二区| 国产精品久久久久久久7电影 | 亚洲在线观看视频网站| 欧美承认网站| 欧美在线观看视频在线| 99精品视频免费全部在线| 国内成人精品视频| 国产精品欧美日韩久久| 欧美成人国产一区二区| 欧美一区午夜精品| 亚洲性视频h| 亚洲精品小视频| 欧美国产大片| 久久综合色综合88| 久久精品国产一区二区电影| 亚洲嫩草精品久久| 一本一道久久综合狠狠老精东影业| 在线观看91久久久久久| 国产日韩欧美制服另类| 国产精品久久久久免费a∨大胸| 欧美精品免费播放| 欧美国产第二页|