【问题标题】:Import FBX Vertex And Index Buffer To DirectX 11将 FBX 顶点和索引缓冲区导入 DirectX 11
【发布时间】:2015-08-23 06:43:18
【问题描述】:

好的,我仍在尝试弄清楚如何将 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;
};

【问题讨论】:

  • Autodesk FBX SDK 是一个复杂的野兽,因此要稳健地完成这项工作具有挑战性。您可能想查看像 Samples Content Exporter 这样的完整工作示例,或者尝试导出到 Wavefront OBJ 之类的东西并使用它导入的更简单的案例 - 请参阅 DirectXMeshmeshconvert 工具。
  • 这是一个很好的链接,我一定会克隆 github 项目并在其中包装一些类。我认为这是微不足道的,但......我也确实为波前 obj 格式编写了一个解析器,这仍然是一项正在进行的工作。
  • WaveFront OBJ 的解析器代码可以在 meshconvert 源代码中找到。

标签: graphics import directx fbx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多