C++ 具有X文件的非相干顶点缓冲区

C++ 具有X文件的非相干顶点缓冲区,c++,directx,vertex-buffer,vertices,C++,Directx,Vertex Buffer,Vertices,我试图了解如何从.X文件操纵网格。我首先用一个金字塔(5个顶点)进行测试。我用经典的D3DX函数加载.X D3DXLoadMeshFromX( path.c_str(), D3DXMESH_DYNAMIC, pDevice->GetDeviced3d(), NULL, &pMaterialBuffer, NULL, &m_numMaterials, &m_pMesh); 渲染器中的一切看起来都很好。但是我注意到GetNumVertices()返回16。。。 当我使

我试图了解如何从.X文件操纵网格。我首先用一个金字塔(5个顶点)进行测试。我用经典的D3DX函数加载.X

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中的法线不同,因此必须通过复制(也称为分割)顶点来完成

面法线在这里通常是“最坏情况”,因为每个顶点都可能是唯一的。大多数包含“平滑”逐顶点法线的模型只需要在锐边/折痕上进行顶点拆分

您可能希望查看用于处理网格信息的示例代码库