Direct3D基本圖元
圖元(primitives)是Direct3D中定義的基本圖形表示,它是組成一個單一實體的一組頂點。最簡單的圖元是三維坐標系中多個點的集合,稱為點列表(point
list)。通常,圖元是多邊形(polygon),一個多邊形是由至少三條邊組成的封閉圖形。最簡單的多邊形是三角形,Direct3D使用三角形來構成大多數其他多邊形,這是因為三角形的三個頂點肯定是共面的,而渲染不共面的頂點效率比較低。通過組合三角形可以形成更大、更復雜的多邊形和網格(mesh)。
Direct3D定義了6中基本圖元。
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.
頂點集合(point list)(或稱為點列表)表示將要繪制的圖形是一組獨立的集合,在程序中可以使用點列表表示天空中的星星,或者點畫線等。對點列表圖元同樣可以應用紋理和材質,只不過材質或紋理的顏色只在畫點的位置顯示,而在點之外的任何地方都不顯示。
IDirect3DDevice9的DrawPrimitive()是Direct3D的圖元繪制方法,該方法的聲明如下:
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.
線段集合(line list)(或稱線段列表)表示一組相互獨立的直線段。線段集合可用于在三維場景中繪制下雨等效果,應用程序通過填充一組頂點創建一個線段集合。注意,頂點個數必須是大于等于2的偶數。可以將材質或紋理添加到線段集合中,默認情況下,材質或紋理的顏色沿線段變化而繪制,并不是線段上某一點的顏色。
線段條帶(line strip)是由一組相互連線的線段構成的圖元。可以使用線段條帶創建不封閉的多邊形,封閉多邊形是指最后一個頂點與第一個頂點間用線段連接起來的多邊形。如果使用線段條帶創建多邊形,該多邊形有可能不共面,即不在一個平面內。
一個三角形集合(triangle list)是一系列獨立的三角形。它們可以彼此相鄰,也可以不相鄰。一個三角形集合的頂點數至少是3,并且它的頂點總數必須能被3整除。使用三角形集合創建的對象,其構成部件是不相交的。例如,在三維游戲中創建一面墻的方法就是具體指定一系列小的互不相連的三角形。然后給這些三角形加上看上去發光的材質和紋理,使墻上的每個三角形看上去都發光。因為三角形間可能存在間隙,當玩家盯著游戲中的場景時,可能發現墻后面的場景變得部分可見。
三角形條帶(triangle strips)是一系列相互連接的三角形。因為這些三角形是相互連接的,所以應用程序沒有為每個三角形指定它的三個頂點。大多數三維場景中的對象都是由三角形條帶構成的,這是因為三角形條帶可以高效利用內存和運行時間畫出復雜的對象。
三角形扇(triangle fans)與三角形條帶很相似,不同之處是,三角形扇形共享一個頂點。
使用頂點緩沖區繪制圖形
在Direct3D中,頂點緩沖區(vertex
buffer)是Direct3D用來保存頂點數據的內存緩沖區,由IDirect3DVertexBuffer9接口對象表示。頂點緩沖區可以保存任何類型的頂點數據,并可以對其中的頂點數據進行坐標變換、光照處理、裁剪等操作,頂點緩沖區中的頂點數據表示要輸出到屏幕上顯示的圖形。
根據圖形顯示的需要,頂點緩沖區中的頂點可以包含頂點坐標、顏色、法線方向、紋理坐標等屬性,至于頂點數據具體包含哪些屬性,可以使用靈活頂點格式(Flexible
Vertex Format, FVF)進行描述。
Flexible Vertex Format Constants, or FVF codes, are
used to describe the contents of vertices interleaved in a single data stream
that will be processed by the fixed-function pipeline.
Vertex Data Flags
The following flags describe a vertex format. For
information regarding vertex formats, see Fixed Function FVF Codes (Direct3D 9).
#define |
Description |
Data
order and type |
D3DFVF_DIFFUSE |
Vertex format includes
a diffuse color component. |
DWORD in ARGB order.
See D3DCOLOR_ARGB. |
D3DFVF_NORMAL |
Vertex format includes
a vertex normal vector. This flag cannot be used with the D3DFVF_XYZRHW
flag. |
float, float, float |
D3DFVF_PSIZE |
Vertex format
specified in point size. This size is expressed in camera space units
for vertices that are not transformed and lit, and in device-space units
for transformed and lit vertices. |
float |
D3DFVF_SPECULAR |
Vertex format includes
a specular color component. |
DWORD in ARGB order.
See D3DCOLOR_ARGB. |
D3DFVF_XYZ |
Vertex format includes
the position of an untransformed vertex. This flag cannot be used with
the D3DFVF_XYZRHW flag. |
float, float, float. |
D3DFVF_XYZRHW |
Vertex format includes
the position of a transformed vertex. This flag cannot be used with the
D3DFVF_XYZ or D3DFVF_NORMAL flags. |
float, float, float,
float. |
D3DFVF_XYZB1 through
D3DFVF_XYZB5 |
Vertex format contains
position data, and a corresponding number of weighting (beta) values to
use for multimatrix vertex blending operations. Currently, Direct3D can
blend with up to three weighting values and four blending matrices. For
more information about using blending matrices, see Indexed Vertex
Blending (Direct3D 9). |
1, 2, or 3 floats.
When D3DFVF_LASTBETA_UBYTE4 is used, the last blending weight is treated
as a DWORD. |
D3DFVF_XYZW |
Vertex format contains
transformed and clipped (x, y, z, w) data. ProcessVertices does not
invoke the clipper, instead outputting data in clip coordinates. This
constant is designed for, and can only be used with, the programmable
vertex pipeline. |
float, float, float,
float |
Texture Flags
The following flags describe texture flags used by the
fixed-function pipeline.
#define |
Description |
D3DFVF_TEX0 -
D3DFVF_TEX8 |
Number of texture
coordinate sets for this vertex. The actual values for these flags are
not sequential. |
D3DFVF_TEXCOORDSIZEN(coordIndex) |
Define a texture
coordinate data set. n indicates the dimension of the texture
coordinates. coordIndex indicates texture coordinate index number. See
D3DFVF_TEXCOORDSIZEN and Texture coordinates and Texture Stages. |
Mask Flags
The following flags describe mask flags used by the
fixed-function pipeline.
#define |
Description |
D3DFVF_POSITION_MASK |
Mask for position
bits. |
D3DFVF_RESERVED0,
D3DFVF_RESERVED2 |
Mask values for
reserved bits in the FVF. Do not use. |
D3DFVF_TEXCOUNT_MASK |
Mask value for texture
flag bits. |
Miscellaneous Flags
The following flags describe a variety of flags used by
the fixed-function pipeline.
#define |
Description |
D3DFVF_LASTBETA_D3DCOLOR |
The last beta field in
the vertex position data will be of type D3DCOLOR. The data in the beta
fields are used with matrix palette skinning to specify matrix indices. |
D3DFVF_LASTBETA_UBYTE4 |
The last beta field in
the vertex position data will be of type UBYTE4. The data in the beta
fields are used with matrix palette skinning to specify matrix indices.
// Given the following vertex data definition: struct VERTEXPOSITION { float pos[3]; union { float beta[5]; struct { float weights[4]; DWORD MatrixIndices; // Used as UBYTEs } } };
Given the FVF is
declared as: D3DFVF_XYZB5 | D3DFVF_LASTBETA_UBYTE4. Weight and
MatrixIndices are included in beta[5], where D3DFVF_LASTBETA_UBYTE4 says
to interpret the last DWORD in beta[5] as type UBYTE4.
|
D3DFVF_TEXCOUNT_SHIFT |
The number of bits by
which to shift an integer value that identifies the number of texture
coordinates for a vertex. This value might be used as shown below.
DWORD dwNumTextures = 1; // Vertex has only one set of coordinates.
// Shift the value for use when creating a // flexible vertex format (FVF) combination. dwFVF = dwNumTextures << D3DFVF_TEXCOUNT_SHIFT;
// Now, create an FVF combination using the shifted value.
|
Examples
The following examples show other common flag
combinations.
// Untransformed vertex for lit, untextured, Gouraud-shaded content.
dwFVF = ( D3DFVF_XYZ | D3DFVF_DIFFUSE );
// Untransformed vertex for unlit, untextured, Gouraud-shaded
// content with diffuse material color specified per vertex.
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE );
// Untransformed vertex for light-map-based lighting.
dwFVF = ( D3DFVF_XYZ | D3DFVF_TEX2 );
// Transformed vertex for light-map-based lighting with shared rhw.
dwFVF = ( D3DFVF_XYZRHW | D3DFVF_TEX2 );
// Heavyweight vertex for unlit, colored content with two
// sets of texture coordinates.
dwFVF = ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX2 );