最近在看一些Directx 的入门教程,碰到几个小问题,最后倒是都解决了,这里记录一下备忘。
首先是在绘制多边形时,要注意节点的绘制顺序
在绘制一个三维模型时,发现有一个面无论如何也无法显示,其他的面都正常显示,唯独这一个面。查看了渲染的每一个步骤,似乎都没有问题。
如上图,这是正确情况下显示出来的一个四棱锥,但是当时显示的确是这样
可以看到,有一个面没有显示出来,由于没有打开双面渲染,其他面的背面也是黑的。
为了说明清楚,造成这样现象的原因,先贴上绘制模型的代码。此处使用索引绘制的方法,需要将每个节点的坐标,和引用的节点的序号放入内存。
void init_graphics(void)
{
struct CUSTOMVERTEX vertices[] =
{
{-3.0f, 0.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0)}, //0号节点
{-3.0f, 0.0f, -3.0f, D3DCOLOR_XRGB(255, 0, 0)},
{3.0f, 0.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255)},
{3.0f, 0.0f, 3.0f, D3DCOLOR_XRGB(255, 255, 0)},
{0.0f, 7.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 255)}, //4号节点
};
d3ddev->CreateVertexBuffer(5*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);
short indices[] =
{
0, 1, 2,
3, 0, 2,
0, 4, 1,
1, 4, 2,
2, 4, 3,
3, 4, 0,
};
d3ddev->CreateIndexBuffer(18*sizeof(short),
0,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&i_buffer,
NULL);
VOID* pVoid;
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();
i_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, indices, sizeof(indices));
i_buffer->Unlock();
}
注意到第23行的那三个数字,0, 4, 1是正确显示的情况,如果改写成1., 4, 0,就会出现上面第二幅截图的情况。
4号节点是顶点,0, 1, 2, 3,四个节点是底面上的四个节点。
绘制的顺序决定了三角面的“正向”方向,(右手握拳,拇指上翘所指方向),注意这还不是法向,这只决定平面的两个sides的哪一边会被显示出来。当然,如果设置了双面渲染,会是另一番结果。
当第23行的那三个数字写成1, 4, 0,会指向模型内侧,从外面看去自然就是黑色的了。