2015-09-05 47 views
0

我正在开发一个OpenGLES2项目(iOS),在该项目中我必须将场景/模型导出为FBX格式,以便可以使用FBX Review应用程序将其打开。我已经完成了模型加载的点,法线和材质都很好,但纹理没有被加载。我已经使用iTunes将导出的修复文件和纹理文件粘贴到FBX Review应用程序的文档目录中。以下是我的代码:使用FBX SDK导出的FBX中无法加载的纹理

材质制作:

FbxString lMaterialName = "material"; 
FbxString lShadingName = "Phong"; 
FbxDouble3 lBlack(0.0, 0.0, 0.0); 
FbxDouble3 lRed(0.0, 1.0, 0.0); 
FbxDouble3 lDiffuseColor(1.0, 1.0, 1.0); 
gMaterial = FbxSurfacePhong::Create(pScene, lMaterialName.Buffer()); 
gMaterial->Emissive.Set(lBlack); 
gMaterial->Ambient.Set(lRed); 
gMaterial->Diffuse.Set(lDiffuseColor); 
gMaterial->TransparencyFactor.Set(40.5); 
gMaterial->ShadingModel.Set(lShadingName); 
gMaterial->Shininess.Set(0.5); 

纹理制作:

gTexture = FbxFileTexture::Create(pScene, "Diffuse Texture"); 
gTexture->SetFileName("sample.png"); 
gTexture->SetTextureUse(FbxTexture::eStandard); 
gTexture->SetMappingType(FbxTexture::eUV); 
gTexture->SetMaterialUse(FbxFileTexture::eModelMaterial); 
gTexture->SetSwapUV(false); 
gTexture->SetTranslation(0.0, 0.0); 
gTexture->SetScale(1.0, 1.0); 
gTexture->SetRotation(0.0, 0.0); 

创建FBXLayeredTexture:

finalNode->AddMaterial(gMaterial); 
FbxLayeredTexture* layeredTexture = FbxLayeredTexture::Create(fbxManager, "layered texture"); 
layeredTexture->ConnectSrcObject(gTexture); 
layeredTexture->SetMappingType(FbxTexture::eUV); 
FbxSurfacePhong* surfMaterial = (FbxSurfacePhong*)sampleNode->GetMaterial(0); 
surfMaterial->Diffuse.ConnectSrcObject(layeredTexture); 

// Creating FBXLayerElementUV in another method 
.... 
fbxMesh->InitControlPoints(objMesh->getVerticesCount()); 

FbxLayer* meshLayer = fbxMesh->GetLayer(0); 
FbxLayerElementUV* lUVElement1 = FbxLayerElementUV::Create(fbxMesh, "UVSet1"); 
lUVElement1->SetMappingMode(FbxGeometryElement::eByControlPoint); 
lUVElement1->SetReferenceMode(FbxGeometryElement::eDirect); 
lUVElement1->GetDirectArray().SetCount(objMesh->getVerticesCount()); 

for (int index = 0; index < objMesh->getVerticesCount(); index++) { 
    vertexData* vData = objMesh->getVertexByIndex(index); 
    Vector3 vPos = vData->vertPosition; 
    Vector3 vNor = vData->vertNormal; 
    Vector2 vUV = vData->texCoord1; 

    fbxMesh->SetControlPointAt(fbxsdk_2015_1::FbxVector4(vPos.x, vPos.y, vPos.z), fbxsdk_2015_1::FbxVector4(vNor.x, vNor.y, vNor.z), index); 
    //fbxMesh->AddTextureUV(FbxVector2(vUV.x, vUV.y)); // For Trial 
    lUVElement1->GetDirectArray().Add(FbxVector2(vUV.x, vUV.y)); 
} 
meshLayer->SetUVs(lUVElement1); 
// And Finally 
    ... 
    finalNode->SetNodeAttribute(fbxMesh); 
    finalNode->SetShadingMode(FbxNode::eTextureShading); 

在此先感谢。

回答

1

在这一行,你应该改变 “fbxManager” 到 “pScene”:

FbxLayeredTexture* layeredTexture = FbxLayeredTexture::Create(fbxManager, "layered texture");