D3DPRIMITIVETYPE和D3DCULL_MODE以及顶点等相关总结

(本文写于: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   )  :把逆时针的方向看作背面剔除掉(在消隐中为默认值)。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值