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

天行健 君子當自強而不息

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 閱讀(1298) 評論(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>
            亚洲精品一区二区三区婷婷月| 亚洲国产精品久久久久秋霞影院 | 久久一区国产| 国产一区二区三区久久精品| 久久电影一区| 久久国内精品视频| 一区在线观看| 亚洲人体1000| 欧美午夜宅男影院| 欧美在线国产精品| 久久免费黄色| 一区二区三区不卡视频在线观看| 日韩视频永久免费| 国产欧美日韩亚洲精品| 久久久99精品免费观看不卡| 久久网站免费| 亚洲视频网在线直播| 亚洲欧美日韩综合| 亚洲国产日韩欧美一区二区三区| 亚洲精品久久久久久久久久久| 国产精品九九久久久久久久| 久久精品首页| 欧美日本亚洲| 久久久中精品2020中文| 欧美xxx在线观看| 午夜精品偷拍| 欧美成人性生活| 欧美中文在线免费| 欧美激情一区二区三区在线视频观看| 亚洲欧美精品伊人久久| 久久精品免费| 午夜在线成人av| 欧美高清不卡| 久久综合图片| 国产精品亚发布| 亚洲日韩欧美视频一区| 韩国一区电影| 亚洲一二三区视频在线观看| 亚洲黄色一区| 久久成人国产| 欧美伊久线香蕉线新在线| 欧美黄色aaaa| 免费成人性网站| 国产一区二区日韩| 一本一道久久综合狠狠老精东影业| 伊人久久大香线| 亚洲欧美视频| 香蕉久久夜色精品国产使用方法| 欧美大片va欧美在线播放| 久久综合一区二区三区| 国产精品久久久久一区二区三区共| 亚洲高清资源| 亚洲国产综合在线看不卡| 欧美一区二区三区四区在线 | 亚洲精品免费看| 久久精品毛片| 久久久噜噜噜久噜久久| 国产欧美日韩精品丝袜高跟鞋 | 亚洲经典三级| 亚洲国产日韩欧美一区二区三区| 欧美中文日韩| 久久全球大尺度高清视频| 国产精品自拍三区| 亚洲婷婷免费| 性色av一区二区三区红粉影视| 欧美日韩一卡二卡| 日韩午夜三级在线| 亚洲在线电影| 国产精品一二一区| 亚洲欧美日韩国产| 欧美一区影院| 狠狠操狠狠色综合网| 久久精品女人的天堂av| 蜜臀久久99精品久久久画质超高清| 国产视频一区欧美| 久久精品国产999大香线蕉| 久久久久网站| 亚洲电影欧美电影有声小说| 女人色偷偷aa久久天堂| 亚洲日本欧美天堂| 中文精品一区二区三区| 国产精品人人做人人爽人人添| 亚洲自拍啪啪| 美玉足脚交一区二区三区图片| 亚洲国产一区二区在线| 欧美精品激情blacked18| 夜夜嗨av一区二区三区免费区| 亚洲一区在线直播| 国产夜色精品一区二区av| 久久亚洲电影| 999在线观看精品免费不卡网站| 午夜综合激情| 伊人久久男人天堂| 欧美区一区二区三区| 亚洲欧美中文另类| 欧美黄色aaaa| 香蕉精品999视频一区二区| 国外视频精品毛片| 欧美国产国产综合| 亚洲综合色视频| 欧美大片91| 欧美在线亚洲在线| 亚洲日本免费电影| 国产精品乱码一区二区三区| 久久久久一本一区二区青青蜜月| 亚洲国产专区校园欧美| 久久成人免费日本黄色| 日韩视频免费观看| 国产日韩欧美三级| 欧美日韩在线直播| 久久久久综合网| 亚洲欧美精品伊人久久| 亚洲高清久久| 久久先锋资源| 亚洲欧美卡通另类91av| 亚洲人体1000| 一区二区视频免费完整版观看| 欧美色网在线| 欧美成人黄色小视频| 欧美主播一区二区三区美女 久久精品人| 亚洲国产视频一区| 久久综合99re88久久爱| 亚洲欧美日韩在线综合| 亚洲美女av黄| 亚洲区免费影片| 黄色精品一区| 国产综合精品一区| 国产精品综合不卡av| 欧美日韩精品一本二本三本| 久久野战av| 久久九九国产精品| 欧美中文字幕视频| 亚洲欧美综合另类中字| 中文国产成人精品| 日韩午夜在线观看视频| 亚洲国产精品成人久久综合一区 | 亚洲精品在线免费| **网站欧美大片在线观看| 国产一区亚洲一区| 国产精品久久久久高潮| 欧美特黄一级| 欧美亚洲成人网| 国产精品嫩草影院av蜜臀| 国产精品hd| 国产精品欧美激情| 国产精品美女久久久| 国产精品久久久久久久久久免费| 欧美日韩一区二区三| 欧美日韩一区二区精品| 欧美视频一区| 国产精品日韩在线观看| 国产精品一级久久久| 国产日产欧产精品推荐色| 国产在线观看91精品一区| 国产亚洲网站| 亚洲成人在线网| 日韩午夜av电影| 亚洲一区二区3| 久久国产日韩欧美| 蜜桃av噜噜一区| 亚洲黄色成人| 亚洲视频视频在线| 亚欧成人在线| 免费成年人欧美视频| 欧美日韩高清不卡| 国产精品日韩在线播放| 国产综合色产| 亚洲九九九在线观看| 亚洲在线视频一区| 久久久久久黄| 亚洲第一偷拍| 亚洲在线黄色| 美女精品网站| 欧美性视频网站| 影音先锋成人资源站| 99精品视频免费观看| 欧美中文字幕不卡| 欧美国产欧美亚洲国产日韩mv天天看完整 | 精品成人在线| 99在线精品视频| 久久精品一本| 亚洲精品视频在线| 欧美一级一区| 欧美日韩高清区| 狠狠88综合久久久久综合网| 夜夜嗨av一区二区三区四区 | 一区二区三区国产在线| 欧美在线free| 亚洲第一综合天堂另类专| 亚洲一区二区在线免费观看| 久久综合九色综合欧美就去吻| 欧美日韩午夜在线| 在线成人中文字幕| 亚洲欧美激情视频| 亚洲国产成人一区| 欧美一区二区三区视频在线| 欧美日韩国产欧| **网站欧美大片在线观看| 午夜欧美大片免费观看| 亚洲精品国产欧美|