C++ 使用D3DPT_LINELIST渲染三维线

C++ 使用D3DPT_LINELIST渲染三维线,c++,direct3d,C++,Direct3d,当尝试使用D3DPT\u LINELIST在三维空间中绘制直线时,Direct3D向我提供了一个关于无效顶点声明的错误,表示无法将其转换为FVF。我使用的顶点声明和着色器/流设置与我的D3DPT_三角形列表渲染完全正确 如何使用D3DPT_LINELIST在三维空间中渲染某些线条 这是我的原始抽签通知 D3DCALL(device->SetVertexDeclaration(VertexDecl)); D3DCALL(device->SetStreamSource(1, PerBon

当尝试使用
D3DPT\u LINELIST
在三维空间中绘制直线时,Direct3D向我提供了一个关于无效顶点声明的错误,表示无法将其转换为
FVF
。我使用的顶点声明和着色器/流设置与我的
D3DPT_三角形列表
渲染完全正确

如何使用
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));

lineindex
只是
0,1
linevert
只是
{0,0,0}
{1,0,0}
,表示沿X轴的单位3D线。

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

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

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

第5.7节:

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

该表只是头文件中的
D3DFVF.*
常量列表


因此,在您的情况下-尝试将颜色组件移动到PeristanceData(stream 1)结构中的tex coords组件之前。

您可以发布调用CreateVertexDeclaration()、SetVertexDeclaration()和相关顶点着色器代码的代码吗?@Asaf:请稍等片刻以查找这些特定的片段。实际上,我正在使用着色器。。。但是,正如您正确指出的,在绘制时它没有设置为设备,这可能是有问题的错误。给我几个小时测试一下,我会回来报告的。
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)
));