将FBX顶点和索引缓冲区导入DirectX 11

时间:2015-06-08 17:13:45

标签: graphics import directx fbx

好的,我还在试图弄清楚如何正确地将FBX顶点和索引缓冲区导入DirectX 11.我编写了一个控制器来执行此操作并将顶点和索引缓冲区传递给DX11渲染器,输出应该看起来像一个立方体,但它不是,我只看到没有意义的三角形。

代码如下所示。不过,我确实将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;
};

1 个答案:

答案 0 :(得分:0)

我认为你的索引缓冲区创建存在一些问题。 您只需为每个顶点提供一个索引,并且索引缓冲区不会以这种方式工作。 如果你解决了这个问题,请告诉我。