Несогласованный буфер вершин с файлом X

Я пытаюсь понять, как манипулировать сеткой из файла .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

Так как же возможно иметь эти 16 вершин, если файл содержит только 5? Моя цель - иметь возможность редактировать координату вершины XYZ.

Большое спасибо!


person Benchy1339    schedule 02.03.2015    source источник


Ответы (1)


Это связано с тем, что каждая вершина может иметь только одну позицию и одну нормаль к вершине. Модель указана как имеющая нормали face (т. е. каждая грань имеет уникальную нормаль), что требует указания дублирования вершин как поверхностных нормалей. .

Первая грань 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 повторно используются на 3-й грани, нормали отличаются от нормалей грани 0, поэтому это необходимо сделать путем дублирования (т. е. разделения) вершины.

Нормали грани обычно являются «наихудшим случаем», поскольку каждая вершина может быть уникальной. Большинству моделей, содержащих «гладкие» нормали для каждой вершины, требуется, чтобы разделение вершин происходило только на острых краях/сгибах.

Возможно, вы захотите взглянуть на библиотеку DirectXMesh, чтобы посмотреть пример кода для обработки информации о сетке. .

person Chuck Walbourn    schedule 02.03.2015