使用D3DPT_LINELIST渲染三维线
Using D3DPT_LINELIST to render 3D lines
当尝试用D3DPT_LINELIST
在3D空间中绘制线时,Direct3D会向我提供一个关于无效顶点声明的错误,称其无法转换为FVF
。我使用的顶点声明和着色器/流设置与我的D3DPT_TRIANGLELIST
渲染相同,完全正确。
如何使用D3DPT_LINELIST
在三维空间中渲染某些线条?
这是我的原始Draw调用。
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, 1
,LineVerts
只是{0,0,0}
和{1,0,0}
,以表示沿X轴的单位3D线。
我不确定你是否真的在使用顶点着色器(没有看到它的代码——它是一个固定的管道吗?)。我不知道是什么原因导致三角形和线列表之间的差异,但你得到的错误意味着你的顶点声明无法转换为旧的FVF。
从这里开始(第177-5.8.1页:固定功能声明):
当使用带有顶点声明的固定函数管道时,必须将相应的顶点组件映射到特定用途。您可以使用多个流,但顶点必须符合第5.7节中描述的FVF代码的顺序和类型约束。
以及第5.7节:
顶点组件在内存中的排列顺序与表中列出的顶点组件相同,从位置组件开始。
该表只是头文件中D3DFVF_*
常量的列表。
因此,在您的情况下,尝试将颜色组件移动到PerInstanceData(流1)结构中的tex coords组件之前。
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 如何使用qt缩放三维网格
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 使用vtkImageReslice重新切片三维原始图像
- 特征:创建一个具有函数的三维阵列
- 扩充矩阵的行缩减-三维样条曲线计算
- 使用pcl transformcloud将三维点平移并旋转到原点
- 用C++从三维矢量中删除元素
- 如何访问CGAL三维三角测量中的面
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- std::将三维数组复制到三维向量中
- 显示结构的三维数组
- 如何将X 2维数组连接到一个三维阵列中
- 使用unique_ptr来管理三维数组
- 如何访问三维矩阵元素
- 无法访问三维数组中的特定位置
- 如何将 HDC 位图快速复制到三维阵列?
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 如何使用opencv和c++实现三维sift算法
- 如何根据给定Z值的图片计算三维坐标