使用D3DPT_LINELIST渲染3D线条

时间:2012-03-29 19:33:57

标签: c++ direct3d

当试图用D3DPT_LINELIST在3D空间中绘制一条线时,Direct3D给出了一个关于无效顶点声明的错误,说它无法转换为FVF。我正在使用与D3DPT_TRIANGLELIST渲染完全正确的D3DPT_LINELIST渲染相同的顶点声明和着色器/流设置。

如何使用D3DCALL(device->SetVertexDeclaration(VertexDecl)); D3DCALL(device->SetStreamSource(1, PerBoneBuffer.get(), 0, sizeof(PerInstanceData))); D3DCALL(device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA | 1)); D3DCALL(device->SetStreamSource(0, LineVerts, 0, sizeof(D3DXVECTOR3))); D3DCALL(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA | lines.size())); D3DCALL(device->SetIndices(LineIndices)); PerInstanceData* data; std::vector<Wide::Render::Line*> lines_vec(lines.begin(), lines.end()); D3DCALL(PerBoneBuffer->Lock(0, lines.size() * sizeof(PerInstanceData), reinterpret_cast<void**>(&data), D3DLOCK_DISCARD)); std::for_each(lines.begin(), lines.end(), [&](Wide::Render::Line* ptr) { data->Color = D3DXColor(ptr->Colour); D3DXMATRIXA16 Translate, Scale, Rotate; D3DXMatrixTranslation(&Translate, ptr->Start.x, ptr->Start.y, ptr->Start.z); D3DXMatrixScaling(&Scale, ptr->Scale, 1, 1); D3DXMatrixRotationQuaternion(&Rotate, &D3DQuaternion(ptr->Rotation)); data->World = Scale * Rotate * Translate; }); D3DCALL(PerBoneBuffer->Unlock()); D3DCALL(device->DrawIndexedPrimitive(D3DPRIMITIVETYPE::D3DPT_LINELIST, 0, 0, 2, 0, 1)); 在3D空间中渲染一些线?

这是我的原始Draw调用。

D3DVERTEXELEMENT9 BasicMeshVertices[] = {
    {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
    {1, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
    {1, 16, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
    {1, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2},
    {1, 48, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3},
    {1, 64, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
    D3DDECL_END()
};
D3DCALL(Device->CreateVertexDeclaration(
    BasicMeshVertices,
    PointerToPointer(BasicMeshVertexDecl)
));

这是我的顶点声明:

LineIndices

0, 1只是LineVerts{0,0,0}只是{1,0,0}和{{1}},代表沿X轴的单位3D线。

1 个答案:

答案 0 :(得分:2)

我不确定你是否真的使用了顶点着色器(没有看到它的代码 - 它是一个固定的管道吗?)。我不知道什么可能导致三角形和行列表之间的差异,但是你得到的错误意味着你的顶点声明无法转换为旧的FVF。

here(第177页 - 5.8.1:固定功能声明):

  

当使用带有顶点声明的固定函数管道时,必须将相应的顶点组件映射到特定用法。您可以使用多个流,但顶点必须符合5.7节中描述的FVF代码的顺序和类型约束。

从第5.7节开始:

  

顶点组件在内存中的排列顺序与表中列出的顶点组件的顺序相同,从位置组件开始。

该表只是头文件中D3DFVF_*常量的列表。

所以在你的情况下 - 尝试将颜色组件移动到PerInstanceData(stream 1)结构中的tex coords组件之前。