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

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

Direct3D中的繪制(2)

3.2 渲染狀態(tài)

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

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.

 

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

_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

注意:查看DirectX SDK中關(guān)于D3DRENDERSTATETYPE的信息。其中詳細(xì)介紹了所有的渲染狀態(tài)。

 

3.3 繪制準(zhǔn)備

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

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

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

HRESULT IDirect3DDevice9::SetStreamSource(

       UINT StreamNumber,

       IDirect3DVertexBuffer9* pStreamData,

       UINT OffsetInBytes,

       UINT Stride

);

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

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

OffsetInBytes——相對流開始處的偏移量。以字節(jié)為單位,它指定被填入渲染管線的頂點(diǎn)數(shù)據(jù)的開始位置。通過檢查D3DCAPS9結(jié)構(gòu)中的D3DDEVCAPS2_STREAMOFFSET標(biāo)志,假如你的設(shè)備支持,那么這個參數(shù)就有一些非0值。

Stride——我們在頂點(diǎn)緩存中操作的每個部分的流的字節(jié)大小。

例如,假設(shè)vb是一個已經(jīng)填充了頂點(diǎn)信息的頂點(diǎn)緩存:

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

 

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

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

 

3.4用頂點(diǎn)/索引緩存繪制

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

 

3.4.1 IDirect3DDevice9::DrawPrimitive

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

HRESULT IDirect3DDevice9::DrawPrimitive(

       D3DPRIMITIVETYPE PrimitiveType,

       UINT StartVertex,

       UINT PrimitiveCount

);

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

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

PrimitiveCount——繪制圖元的個數(shù)。

例子:

// 繪制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——我們繪制的圖元類型。比如,我們能繪制點(diǎn)和線以及三角形。以后我們使用三角形,用D3DPT_TRIANGLELIST參數(shù)。

BaseVertexIndex——一個基本數(shù)字,在調(diào)用中用它去加上索引。參看下面的說明。

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

NumVertices——在此調(diào)用中將被引用的頂點(diǎn)數(shù)。

StartIndex——索引到索引緩存中的某個位置,它標(biāo)記開始渲染的開始索引點(diǎn)。

PrimitiveCount——繪制圖元的個數(shù)。

例子:

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

 

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

 

在索引緩存中定位頂點(diǎn)相應(yīng)的也就在頂點(diǎn)緩存中定位了。然而,假設(shè)我們想將球,盒子,圓柱體的頂點(diǎn)放置到一個公共的頂點(diǎn)緩存中。對于每一個物體,我們將不得不再計(jì)算在公共頂點(diǎn)緩存中的索引。這個新的索引值是通過與一個偏移量相加得到。注意這個偏移量是標(biāo)準(zhǔn)的頂點(diǎn),而不是字節(jié)。

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

 

3.4.3 開始/結(jié)束場景

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

_device->BeginScene();

// 繪制場景

_device->DrawPrimitive(...);

_device->EndScene();

 

3.5 D3DX幾何物體

通過在代碼中建造每個三角形來建造3D物體是一件非??菰锏氖?。幸運(yùn)的是,D3DX庫已經(jīng)為我們提供了一些方法來產(chǎn)生簡單3D物體的網(wǎng)格數(shù)據(jù)。

D3DX庫提供如下6種網(wǎng)格生成函數(shù)。

D3DXCreateBox

D3DXCreateSphere

D3DXCreateCylinder

D3DXCreateTeapot

D3DXCreatePolygon

D3DXCreateTorus

這6種函數(shù)的使用都很類似,并且使用D3DX網(wǎng)格數(shù)據(jù)結(jié)構(gòu)ID3DXMesh就象使用ID3DXBuffer接口一樣。現(xiàn)在,我們忽視它們的詳細(xì)信息,只需簡單使用它們即可。

HRESULT D3DXCreateTeapot(

       LPDIRECT3DDEVICE9 pDevice, // 與mesh關(guān)聯(lián)的設(shè)備

       LPD3DXMESH* ppMesh, // 返回的mesh

       LPD3DXBUFFER* ppAdjacency // 現(xiàn)在設(shè)成0

);

 

一個使用D3DXCreateTeapot函數(shù)的例子:

ID3DXMesh* mesh = 0;

D3DXCreateTeapot(_device, &mesh, 0);

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

_device->BeginScene();

       mesh->DrawSubset(0);

_device->EndScene();

 

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

mesh->Release();

_mesh = 0;

 

 

 實(shí)例程序:三角形

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

/**************************************************************************************
  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)  編輯 收藏 引用


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


公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(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>
            欧美一区国产一区| 亚洲女女女同性video| 香蕉乱码成人久久天堂爱免费| 国产午夜精品全部视频播放| 久久亚洲一区二区三区四区| 欧美jizz19性欧美| 亚洲欧美日本国产专区一区| 久久激情五月婷婷| 中文国产一区| 久久午夜视频| 午夜天堂精品久久久久| 免费亚洲视频| 久久久久久久综合日本| 欧美精品久久久久久久久久| 欧美一级黄色网| 老司机一区二区三区| 亚洲尤物影院| 欧美成人dvd在线视频| 欧美一区二区黄色| 欧美大胆人体视频| 麻豆成人在线| 国产一区二区三区高清| 欧美综合二区| 欧美日韩成人在线视频| 久久精品盗摄| 欧美三级精品| 亚洲激情二区| 国产精品视频网| 亚洲欧洲日韩综合二区| 国产性猛交xxxx免费看久久| 亚洲最新在线| 日韩一区二区电影网| 另类人畜视频在线| 久久日韩精品| 国产真实乱偷精品视频免| 亚洲一区成人| 亚洲午夜电影| 欧美伦理在线观看| 亚洲高清免费| 伊人成人开心激情综合网| 欧美一区二区三区免费视| 欧美一激情一区二区三区| 国产精品久久久久毛片大屁完整版| 亚洲激情视频网| 亚洲理论在线| 欧美激情一区二区三区不卡| 欧美电影打屁股sp| 亚洲电影自拍| 欧美国产激情| 亚洲精品欧美专区| 亚洲视频观看| 欧美日韩一区在线观看视频| 最新日韩欧美| 亚洲先锋成人| 国产精品稀缺呦系列在线| 亚洲一区二区久久| 欧美一区=区| 国产原创一区二区| 久久婷婷久久一区二区三区| 免费亚洲一区二区| 亚洲国产精品传媒在线观看| 麻豆乱码国产一区二区三区| 亚洲第一久久影院| 亚洲天堂成人在线观看| 欧美亚洲成人精品| 午夜精品影院在线观看| 老**午夜毛片一区二区三区| 亚洲国产精品电影| 欧美另类视频| 一本色道久久综合精品竹菊 | 久久久久久亚洲精品不卡4k岛国| 国产拍揄自揄精品视频麻豆| 久久成人精品无人区| 欧美成人第一页| 亚洲免费成人av电影| 欧美日本精品在线| 欧美一级淫片aaaaaaa视频| 欧美大片免费观看在线观看网站推荐 | 亚洲人成毛片在线播放| 欧美日本国产精品| 亚洲影视九九影院在线观看| 久久精品国产77777蜜臀| 影音先锋欧美精品| 欧美日韩视频不卡| 欧美一区二区三区免费视| 亚洲第一黄色| 亚洲一区精品视频| 欧美成人中文| 亚洲欧美在线看| 国产精品色午夜在线观看| 欧美一区二区在线观看| 欧美激情小视频| 午夜在线电影亚洲一区| 亚洲国产日韩在线一区模特| 欧美午夜精品久久久久久久| 久久精品系列| 中文精品一区二区三区| 欧美大片va欧美在线播放| 亚洲自拍啪啪| 亚洲激情校园春色| 国产日韩欧美三区| 欧美精品xxxxbbbb| 久久精品欧美日韩| 亚洲视频一区二区在线观看 | 国产精品一区二区女厕厕| 另类激情亚洲| 久久精品国产免费看久久精品| 日韩一级裸体免费视频| 欧美成人免费网站| 欧美在线观看一二区| 一区二区三区精品国产| 亚洲福利视频二区| 国产手机视频精品| 国产精品成人国产乱一区| 欧美激情中文字幕一区二区| 久久久久久自在自线| 午夜欧美大片免费观看| 亚洲一区二区动漫| 99国产精品久久久久老师| 亚洲国产精品黑人久久久| 久久综合网色—综合色88| 欧美在线播放视频| 欧美在线播放一区二区| 亚洲欧美日韩另类| 亚洲伊人久久综合| 亚洲午夜伦理| 一区二区三区精品视频| 亚洲精品资源美女情侣酒店| 亚洲国产99精品国自产| 国精品一区二区| 国产亚洲成精品久久| 国产欧美日韩免费看aⅴ视频| 国产精品久久久一本精品| 国产精品久久91| 国产精品成人v| 国产精品电影网站| 国产精品久久久久7777婷婷| 国产精品久久久久久户外露出| 欧美午夜片欧美片在线观看| 国产精品成人aaaaa网站| 国产精品久久国产愉拍| 国产精品丝袜xxxxxxx| 国产精品视频专区| 国产午夜精品视频| 激情偷拍久久| 亚洲激情欧美激情| 一区二区欧美亚洲| 亚洲图片欧美一区| 午夜视频在线观看一区| 欧美在线啊v一区| 麻豆91精品91久久久的内涵| 欧美国产第一页| 亚洲精品日韩久久| 亚洲与欧洲av电影| 欧美一区二区三区视频在线| 久久精品免视看| 欧美国产综合一区二区| 欧美日韩综合不卡| 国产欧美日韩精品在线| 狠狠爱www人成狠狠爱综合网| 伊人久久婷婷色综合98网| 最新高清无码专区| 亚洲自拍偷拍麻豆| 久久久久欧美精品| 亚洲国产欧美一区二区三区丁香婷| 国产精品99久久不卡二区| 欧美在线一区二区三区| 久久在线播放| 欧美久久久久久蜜桃| 国产精品扒开腿做爽爽爽视频| 国产欧美日韩精品专区| 亚洲福利视频一区二区| 中日韩美女免费视频网址在线观看 | 久久影音先锋| 亚洲第一网站免费视频| 99在线精品免费视频九九视| 亚洲欧美日韩一区二区在线 | 性欧美8khd高清极品| 久久一区欧美| 日韩视频永久免费| 欧美一区二区在线免费播放| 欧美国产先锋| 国产一区二区久久久| 日韩视频免费在线| 久久九九国产精品怡红院| 91久久精品久久国产性色也91| 亚洲一区二区在线观看视频| 裸体女人亚洲精品一区| 国产精品久久久久久久久久直播| 国产一区二区精品久久| 一区二区三区免费看| 久久综合色一综合色88| 一区二区三区日韩在线观看 | 欧美中文字幕不卡| 亚洲黄色av一区| 羞羞答答国产精品www一本| 欧美日韩欧美一区二区| 亚洲成色www久久网站| 亚洲综合三区| 亚洲欧洲一区二区天堂久久|