2015-06-08 2 views
0

Хорошо, я все еще пытаюсь понять, как правильно импортировать вершинный и индексный буфер FBX в DirectX 11. Я написал контроллер для этого и передал буфер вершин и индексов рендеринга DX11, вывод должен выглядеть как куб, но это не так, я вижу только треугольники, которые не имеют смысла.Импорт FBX Vertex And Index Buffer в DirectX 11

Код показан ниже. Однако я умножал значения Z на -1.

Что мне нужно изменить, чтобы получить рендер?

#pragma once 

#include "Array.h" 
#include "Vector.h" 
#include "fbxsdk.h" 
#include <assert.h> 
#include "constants.h" 

class FbxController 
{ 
public: 
    FbxController(); 
    ~FbxController(); 


    void Import(const char* lFilename) 
    { 
     lImporter = FbxImporter::Create(lSdkManager, ""); 
     bool lImportStatus = lImporter->Initialize(lFilename, -1, lSdkManager->GetIOSettings()); 

     if (!lImportStatus) { 
      printf("Call to FbxImporter::Initialize() failed.\n"); 
      printf("Error returned: %s\n\n", lImporter->GetStatus().GetErrorString()); 
      exit(-1); 
     } 

    lScene = FbxScene::Create(lSdkManager, "myScene"); 
    lImporter->Import(lScene); 
    FbxNode* lRootNode = lScene->GetRootNode(); 
    int childCount = lRootNode->GetChildCount(); 
    FbxNode *node1 = lRootNode->GetChild(0); 
    const char* nodeName1 = node1->GetName(); 
    fbxsdk::FbxMesh *mesh = node1->GetMesh(); 
    int cpCount1 = mesh->GetControlPointsCount(); 
    fbxsdk::FbxVector4 *controlPoints = mesh->GetControlPoints(); 
    for (int i = 0; i < cpCount1; i++) 
    { 
     fbxsdk::FbxVector4 cpitem = controlPoints[i]; 
     printf("%d, %d, %d, %d", cpitem[0], cpitem[1], cpitem[2], cpitem[3]); 
     VERTEXPOSCOLOR vpc; 
     vpc.Color.x = 0.5f; 
     vpc.Color.y = 0.5f; 
     vpc.Color.z = 0.5f; 
     vpc.Position.x = cpitem[0]; 
     vpc.Position.y = cpitem[1]; 
     vpc.Position.z = cpitem[2] * -1.0f; 
     m_vertices.add(vpc); 
    } 
    int pvCount = mesh->GetPolygonVertexCount(); 
    int polyCount = mesh->GetPolygonCount(); 
    for (int i = 0; i < polyCount; i++) 
    { 
     int polyItemSize = mesh->GetPolygonSize(i); 
     assert(polyItemSize == 3); 
     for (int j = 0; j < polyItemSize; j++) 
     { 
      int cpIndex = mesh->GetPolygonVertex(i, j); 
      m_indices.add(cpIndex); 
      float x = controlPoints[cpIndex].mData[0]; 
      float y = controlPoints[cpIndex].mData[1]; 
      float z = controlPoints[cpIndex].mData[2]; 
     } 
    } 
    fbxsdk::FbxMesh *mesh2; 
    bool isT = mesh->IsTriangleMesh(); 
    FbxNode *node2 = lRootNode->GetChild(1); 
    FbxNode *node3 = lRootNode->GetChild(2); 
    //lImporter->Destroy(); 
} 

Array<VERTEXPOSCOLOR> GetVertexPosColors() 
{ 
    return m_vertices; 
} 

Array<unsigned int> getIndexBuffer() 
{ 
    return m_indices; 
} 

protected: 
    FbxManager *lSdkManager; 
    FbxIOSettings *ios; 
    FbxImporter *lImporter; 
    bool lImportStatu; 
    FbxScene *lScene; 


private: 
    Array<VERTEXPOSCOLOR> m_vertices; 
    Array<unsigned int> m_indices; 
}; 
+0

Autodesk FBX SDK - это сложный зверь, поэтому это сложно сделать решительно. Возможно, вам стоит взглянуть на полностью рабочий пример, например [Экспонентов содержимого образцов] (http://go.microsoft.com/fwlink/?LinkId=226208) или попробуйте более простой пример экспорта на что-то вроде Wavefront OBJ и импорт с помощью это - см. инструмент DirectXMesh (http://go.microsoft.com/fwlink/?LinkID=324981) '' meshconvert''. –

+0

Это хорошая ссылка, я обязательно буду клонировать проект github и переношу некоторые из классов. Я думал, что это было тривиально, но ... Кроме того, я написал синтаксический анализатор для формата obj wavefront, который все еще работает. – benG

+0

Код Parser для WaveFront OBJ можно найти в источнике '' meshconvert''. –

ответ

0

Я думаю, что у вас есть проблемы с созданием буфера индекса. Вы просто указываете индекс для каждой вершины, а индексный буфер не работает таким образом. дайте мне знать, если вы решите это.