(本文写于:2010-01-28 21:50:03)
【关于D3DFVF_XYZ和D3DFVF_XYZRHW】
1:如果使用了顶点格式D3DFVF_XYZ,则Direct3D将执行视、投影、世界等变换以及进行光线计算,之后你才能在窗口中得到你所绘制的物体。他的坐标系就是D3D中的左手坐标系,X轴向右递增,Y轴向上递增。
2:如果使用了顶点格式D3DFVF_XYZRHW,则告知Direct3D使用的顶点已经在屏幕坐标系中了,不再执行视图、投影、世界等变换和光线计算,因为D3DFVF_XYZRHW标志告诉它顶点已经经过了这些处理,并直接将顶点进行光栅操作。任何用SetTransform进行的转换都对其无效。所以他的坐标系就是屏幕坐标系,X轴向右递增,Y轴向下递增。
★注意:纹理坐标用的是屏幕坐标系。
【关于图元类型:D3DPRIMITIVETYPE】
D3DPRIMITIVETYPE就是图元类型,它是DrawPrimitive()和DrawPrimitiveUP()的第1个参数。
其类型有:
■ D3DPT_POINTLIST :所要绘制的图元是一些点
■ D3DPT_LINELIST :所要绘制的图元是一些线段 (规则:点1和点2连接而构成一个线段,点3和点4连接而构成另一个线段)
■ D3DPT_LINESTRIP :所要绘制的图元是连接的线段 (规则:点1和点2相连构成一个线段,点2和点3相连构成一个线段)
■ D3DPT_TRIANGLELIST :所要绘制的图元是一些离散的三角形 (规则:点1、点2和点3构成一个三角形,而点4、点5和点6构成另一个三角形)
■ D3DPT_TRIANGLESTRIP :所要绘制的图元是一些相连的三角形 (规则:点1、点2和点3构成一个三角形,点2、点3和点4构成另一个三角形)
■ D3DPT_TRIANGLEFAN :这种类型用4个点画的2个三角形可以保证都是顺时针或都是逆时针的(规则:点1、点2和点3构成一个三角形,而点1、点3和点4构成另一个三角形)
D3DFVF_XYZ格式的左手坐标示例
关键代码:
struct CustomVertex
{
float x, y, z;
unsigned long color;
float tu, tv;
};
#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)
CustomVertex objVertex[] =
{
// v1,v2,v3 v1,v3,v4
{ 0, 0, 0, col, 0, 1 }, // v1
{ 0, 256, 0, col, 0, 0 } // v2
{ 256, 256, 0, col, 1, 0 }, // v3
{ 256, 0, 0, col, 1, 1 }, // v4
};
// ...
g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
// ...
D3DFVF_XYZRHW格式的屏幕坐标示例
关键代码:
struct CustomVertex
{
float x, y, z, rhw;
unsigned long col;
float tu, tv;
};
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
CustomVertex objVertex[] =
{
// v1,v2,v3 v1,v3,v4
{ 0, 0, 0, 1, col, 0, 0 }, // v1
{ 256, 0, 0, 1, col, 1, 0 }, // v2
{ 256, 256, 0, 1, col, 1, 1 }, // v3
{ 0, 256, 0, 1, col, 0, 1 } // v4
};
// ...
g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
// ...
【关于背面剔除:D3DCULL_MODE】
注意:
■ D3D默认是把顺时针看成正面,所以通常要把三角形顶点按顺时针顺序进行定义。
■ 确认使用的是 D3DFVF_XYZ 格式还是 D3DFVF_XYZRHW 格式。
SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ) :不要剔除背面,即正反面都绘制。
SetRenderState( D3DRS_CULLMODE, D3DCULL_CW ) :把顺时针的方向看作背面剔除掉。
SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ) :把逆时针的方向看作背面剔除掉(在消隐中为默认值)。