具有X文件的非相干顶点缓冲区
Non coherent Vertex Buffer with X file
我正在尝试了解如何从中操作网格。X文件。我开始测试一个金字塔(5个顶点)。我加载。X与经典的D3DX功能
D3DXLoadMeshFromX( path.c_str(), D3DXMESH_DYNAMIC, pDevice->GetDeviced3d(), NULL, &pMaterialBuffer, NULL, &m_numMaterials, &m_pMesh);
渲染器中的一切看起来都很好。但我注意到GetNumVertices()
返回16。。。当我用GetMesh()->LockVertexBuffer(0(void**)&pVerts);
获得顶点缓冲区并打印所有16个顶点时,我得到的输出是:
0 1 -1
1 0 -1
0 -1 -1
0.13477 0.180836 1.34715
-1 0 -1
0.13477 0.180836 1.34715
0 1 -1
0.13477 0.180836 1.34715
-1 0 -1
0 -1 -1
0.13477 0.180836 1.34715
1 0 -1
-1 0 -1
0 -1 -1
1 0 -1
0 1 -1
来自以下X文件:
Frame Root {
FrameTransformMatrix {
1.000000, 0.000000, 0.000000, 0.000000,
0.000000,-0.000000, 1.000000, 0.000000,
0.000000, 1.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 1.000000;;
}
Frame Cone {
FrameTransformMatrix {
1.000000, 0.000000, 0.000000, 0.000000,
0.000000, 1.000000, 0.000000, 0.000000,
0.000000, 0.000000, 1.000000, 0.000000,
0.000000, 0.000000, 0.000000, 1.000000;;
}
Mesh { // Cone mesh
5;
0.000000; 1.000000;-1.000000;,
1.000000;-0.000000;-1.000000;,
-0.000000;-1.000000;-1.000000;,
0.134770; 0.180836; 1.347146;,
-1.000000; 0.000000;-1.000000;;
5;
3;4,3,2;,
3;1,3,0;,
3;0,3,4;,
3;2,3,1;,
4;4,2,1,0;;
MeshNormals { // Cone normals
5;
-0.657358;-0.657358; 0.368458;,
0.692540; 0.692540; 0.201935;,
-0.679600; 0.679600; 0.276205;,
0.674410;-0.674410; 0.300568;,
0.000000; 0.000000;-1.000000;;
5;
3;0,0,0;,
3;1,1,1;,
3;2,2,2;,
3;3,3,3;,
4;4,4,4,4;;
} // End of Cone normals
} // End of Cone mesh
} // End of Cone
} // End of Root
那么,如果文件只包含5个顶点,怎么可能有这16个顶点呢?我的目标是能够编辑顶点XYZ坐标。
非常感谢!
这是因为每个顶点只能有一个位置和一个顶点法线。模型被指定为具有面法线(即每个面都有一个唯一的法线),这需要将顶点复制指定为每个顶点的法线。
第一个面对于位置是4,3,2,但是对于法线是0,0,0,因此它必须创建3个顶点实例来组合它们,并且网格中没有其他面实际上是相同的。
Face 0:
Vertex A [ position:-1.000000; 0.000000;-1.000000;
normal:-0.657358;-0.657358; 0.368458; ]
Vertex B [ position: 0.134770; 0.180836; 1.347146;
normal:-0.657358;-0.657358; 0.368458; ]
Vertex C [ position: -0.000000;-1.000000;-1.000000
normal:-0.657358;-0.657358; 0.368458; ]
即使原始的4和3位置在第三个面中重复使用,但法线与面0中的法线不同,因此必须通过复制(也称为拆分)顶点来完成。
面法线通常是"最坏情况",因为每个顶点都可以是唯一的。大多数包含"平滑"逐顶点法线的模型只需要在尖锐的边/折痕上进行顶点拆分。
您可能需要查看DirectXMesh库,以获取用于处理网格信息的示例代码。
相关文章:
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- DirectX11只绘制填充索引和顶点缓冲区中的一半顶点
- tiny_obj_loader到 Direct3D 顶点缓冲区和索引缓冲区数组
- OpenGL 顶点缓冲区类重定义和模板方法错误
- D3D11:映射顶点缓冲区时E_OUTOFMEMORY
- C DirectX 11从第二个顶点缓冲区呈现麻烦
- 我可以将单个顶点索引与具有所有属性(位置、法线、texCoord)的顶点缓冲区一起使用吗?
- DirectX:如果绑定索引缓冲区但不绑定顶点缓冲区,会发生什么情况
- Directx 11 - 是将顶点缓冲区中的所有顶点推送到顶点着色器,还是仅编制索引
- 自动生成的顶点缓冲区和索引缓冲区不起作用
- 为什么我的顶点缓冲区对象出现访问冲突错误?
- 为什么我的 openGL 顶点缓冲区对象不会绘制任何内容?
- 在OpenGL中,如何从内存中编辑特定的顶点缓冲区属性
- 我是否需要OpenGL中类似对象的多个顶点缓冲区
- (DirectX 11)单个顶点缓冲区是否可以一次绑定到多个 IA 输入槽
- Directx 10:使用CopySubresourceRegion更新顶点缓冲区
- 具有X文件的非相干顶点缓冲区
- 在DX9上为顶点缓冲区创建结构