2012-03-29 184 views
1

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

如何使用D3DPT_LINELIST在3D空间中渲染某些线条?

这是我的原始绘图调用。

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)); 

这里是我的顶点声明:

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, 1LineVerts只是{0,0,0}{1,0,0},代表沿X轴的单位3D线。

+0

你可以发布你的调用CreateVertexDeclaration(),SetVertexDeclaration()和相关的顶点着色器代码的代码吗? – Asaf 2012-03-29 21:35:24

+0

@Asaf:给我一秒找到那些特定的作品。 – Puppy 2012-03-29 21:50:06

回答

2

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

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

当使用固定成本功能管线与顶点声明,适当的顶点组件必须在每个被映射到特定使用。您可以使用多个流,但顶点必须符合5.7节中所述的FVF代码的顺序和类型约束。

而且从第5.7节:

顶点部件在相同的顺序在表中列出的顶点组件布置在存储器中,开始与所述位置分量。

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

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

+0

我正在使用着色器,实际上......但正如您正确指出的那样,它在绘图时未设置到设备,这可能是有问题的错误。给我几个小时来测试它,我会报告回来。 – Puppy 2012-03-31 12:03:23