DirectX游戲編程心得之:使用2-D坐標顯示2-D圖形的注意事項
來源:程序員人生 發布時間:2014-10-08 20:23:51 閱讀次數:3170次
最近打算做幾款2-D小游戲,當然是用Direct3D來做的,所以就要使用Direct3D提供的2D頂點了。說是2D頂點,其實卻有4個分量!而正是因為這種矛盾性,所以使用起來有不少注意事項。這些是我浪費了很多的青春而發現的,希望大家吸取教訓啊!
具體來說,有這么幾個方面的注意事項:
1、 2-D頂點結構的定義
比如,要定義一個帶紋理坐標的2-D頂點結構,那么應該定義如下:
struct Vertex2DTex
{
Vertex2DTex():pos2D(0.0f, 0.0f, 1.0f, 1.0f), texCoord(0.0f, 0.0f){}
Vertex2DTex(floatx, float y, float u, float v) :
pos2D(x,y, 1.0f, 1.0f), texCoord(u, v) {}
Vertex2DTex(floatx, float y, float z, float rhw, float u, float v) :
pos2D(x,y, z, rhw), texCoord(u, v){}
Vertex2DTex(const D3DXVECTOR4& thePos2D, const D3DXVECTOR2& uv) :
pos2D(thePos2D),texCoord(uv){}
inline Vertex2DTex& operator=(const Vertex2DTex& rhs)
{
if(this != &rhs)
{
pos2D= rhs.pos2D;
texCoord= rhs.texCoord;
}
return*this;
}
D3DXVECTOR4 pos2D;
D3DXVECTOR2 texCoord;
static IDirect3DVertexDeclaration9* Decl;
};
2、 2-D頂點的聲明
比如,針對上述頂點結構,那么聲明如下:
IDirect3DVertexDeclaration9* Vertex2DTex::Decl= 0;
//===============================================================
// Vertex2DTex
D3DVERTEXELEMENT9 Vertex2DTexElements[]=
{
{0, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITIONT, 0 },
{ 0,sizeof(D3DXVECTOR4), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,0 },
D3DDECL_END()
};
gd3dDevice->CreateVertexDeclaration(Vertex2DTexElements, &Vertex2DTex::Decl);
當然,最后不要忘了釋放 Vertex2DTex::Decl 對象。
PS:我們用一個4維向量來表示一個2-D坐標。如果用的是以前的FVF格式的頂點聲明的話,那么會看到這個2-D坐標是x, y, z, rhw。其中,x, y是頂點的屏幕坐標,z表示頂點的深度信息(這樣可以實現Z-Buffer 測試),而rhw似乎總是設為1.0。
3、 使用2-D頂點結構時,在設置D3DPRESENT_PARAMETERS時的注意事項
設md3dPP 是一個D3DPRESENT_PARAMETERS 對象,那么除非有特殊需要,否則這樣設值:
md3dPP.EnableAutoDepthStencil = false;
這樣,不論2-D坐標的z值為0.0和1.0之間的哪個值,都可以在屏幕上顯示出來(除非被遮擋)。
4、 針對2-D頂點使用effect
使用2-D頂點時,也可以使用effect file,但是這時候的technique 只由PixelShader 組成,因為2-D頂點是變換后的頂點了,不能夠對其再進行變換了。所以,事實上,除非你想要對顏色本身做一些處理(比如說轉換成黑白畫面),否則基本上是不需要對2-D頂點使用effect file 的。
不過,如果一定要使用的話,那么PixelShader 的參數為2-D頂點結構中除了2-D坐標以外的那些成分。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈