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

Posted

技术标签:

【中文标题】将 FBX 顶点和索引缓冲区导入 DirectX 11【英文标题】:Import FBX Vertex And Index Buffer To 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 之类的东西并使用它导入的更简单的案例 - 请参阅 DirectXMesh 的 meshconvert 工具。 这是一个很好的链接,我一定会克隆 github 项目并在其中包装一些类。我认为这是微不足道的,但......我也确实为波前 obj 格式编写了一个解析器,这仍然是一项正在进行的工作。 WaveFront OBJ 的解析器代码可以在 meshconvert 源代码中找到。 【参考方案1】:

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

【讨论】:

以上是关于将 FBX 顶点和索引缓冲区导入 DirectX 11的主要内容,如果未能解决你的问题,请参考以下文章

Directx 11 - 是来自顶点缓冲区的所有顶点都推送到顶点着色器还是只是索引的顶点?

C++ DirectX 11 从第二个顶点缓冲区渲染问题

在 DirectX 11 中使用索引缓冲区;它是怎么知道的?

DirectX 大型模型 > 64k C++

(DirectX 11) 单个顶点缓冲区可以一次绑定到多个 IA 输入槽吗?

为啥maya绑定的模型导出fbx会丢失顶点法线信息?