带有 X 文件的非连贯顶点缓冲区
Non coherent Vertex Buffer with X file
我正在尝试了解如何从 .X 文件操作网格。我首先用金字塔(5 个顶点)进行测试。我用经典的 D3DX 函数加载 .X
D3DXLoadMeshFromX( path.c_str(), D3DXMESH_DYNAMIC, pDevice->GetDeviced3d(), NULL, &pMaterialBuffer, NULL, &m_numMaterials, &m_pMesh);
renderer.But 中的一切看起来都很好我注意到 GetNumVertices()
return 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 坐标。
非常感谢!
这是因为每个顶点只能有一个位置和一个顶点法线。该模型被指定为具有 face 法线(即每个面都有一个唯一的法线),这需要 vertex duplication 被指定为 每个顶点法线。
第一个面的位置是 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; ]
尽管在第 3 个面中重复使用了原始的 4 和 3 位置,但法线与面 0 中的法线不同,因此必须通过复制(也称为拆分)顶点来完成。
Face 法线在这里通常是 'worst-case' 因为每个顶点都可以是唯一的。大多数包含 'smooth' 逐顶点法线的模型只需要顶点分裂发生在尖锐的 edges/creases.
您可能想查看 DirectXMesh 库以获取处理网格信息的示例代码。
我正在尝试了解如何从 .X 文件操作网格。我首先用金字塔(5 个顶点)进行测试。我用经典的 D3DX 函数加载 .X
D3DXLoadMeshFromX( path.c_str(), D3DXMESH_DYNAMIC, pDevice->GetDeviced3d(), NULL, &pMaterialBuffer, NULL, &m_numMaterials, &m_pMesh);
renderer.But 中的一切看起来都很好我注意到 GetNumVertices()
return 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 坐标。
非常感谢!
这是因为每个顶点只能有一个位置和一个顶点法线。该模型被指定为具有 face 法线(即每个面都有一个唯一的法线),这需要 vertex duplication 被指定为 每个顶点法线。
第一个面的位置是 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; ]
尽管在第 3 个面中重复使用了原始的 4 和 3 位置,但法线与面 0 中的法线不同,因此必须通过复制(也称为拆分)顶点来完成。
Face 法线在这里通常是 'worst-case' 因为每个顶点都可以是唯一的。大多数包含 'smooth' 逐顶点法线的模型只需要顶点分裂发生在尖锐的 edges/creases.
您可能想查看 DirectXMesh 库以获取处理网格信息的示例代码。