无法让D3DPT_TRIANGLELIST工作

时间:2012-07-20 18:32:43

标签: windows geometry directx vertex-buffer

我尝试使用D3DPT_TRIANGLELIST时遇到问题。以下示例来自一本书,所以我看不出问题所在。

VertexData:

ColorVertex *v;

Triangle->Lock(0,0,(void**)&v,0);

v[0] = ColorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0,0));
v[1] = ColorVertex(0.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(0,255,0));
v[2] = ColorVertex(1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(0,0,255));

Triangle->Unlock();

绘图功能:

Device->SetFVF(ColorVertex::FVF);
Device->SetStreamSource(0,Triangle,0,sizeof(ColorVertex));

D3DXMatrixTranslation(&World,-1.25f,0.0f,0.0f);
Device->SetTransform(D3DTS_WORLD,&World);

Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

D3DXMatrixTranslation(&World,1.25f,0.0f,0.0f);
Device->SetTransform(D3DTS_WORLD,&World);

Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

Device->EndScene();
Device->Present(0,0,0,0);

但是,如果我从D3DPT_TRIANGLELIST更改为例如D3DPT_LINELIST,则会绘制一条线。如果我使用D3DPT_POINTLIST,它只为每个DrawPrimite调用绘制一个点(像素)。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您的顶点坐标不形成三角形,它们是一行中的三个点。

答案 1 :(得分:0)

好吧,在找到工作后我找到了MISTAKE(!),这是新手的好习惯。 它一直在我面前,它在坐标中:

v[0] = ColorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0,0));
v[1] = ColorVertex(0.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(0,255,0));
v[2] = ColorVertex(1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(0,0,255));

这不能形成三角形,因为任何顶点的Y坐标更新都会更改。当然可以绘制线和点,因为它们不需要Y坐标来形成规范。因此,解决方案就是:

v[0] = ColorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0,0));
v[1] = ColorVertex(0.0f, 1.0f, 2.0f, D3DCOLOR_XRGB(0,255,0));
v[2] = ColorVertex(1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(0,0,255));