Assimp加载排放图

时间:2016-11-27 09:06:23

标签: c++ opengl assimp

我正在使用Assimp加载我的模型和网格,这些模型和网格到目前为止一直很好用。我正在尝试从我从blender导出.obj文件时生成的.mtl文件加载发射映射。它可以很好地加载漫反射,法线和高光贴图,但由于某种原因,它似乎根本找不到文件中的发射贴图。

这是.mtl文件:

# Blender MTL File: 'basiclevel.blend'
# Material Count: 1

newmtl megaGem
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
map_Kd Textures\gemB_diff.jpg
map_Ke Textures\gemB_emit.jpg
map_Ks Textures\gemB_spec.jpg
map_Bump Textures\gemB_norm.jpg

(我缩短了文件路径,因为它们很长而且很不清楚,漫反射,法线和高光贴图加载并渲染得很好)

我正在加载纹理:

std::vector<glTexture> emissionTextures = loadTextures(
    material,
    aiTextureType_EMISSIVE,
    MAP_TYPE::EMISSION
);
meshTextures.insert(
    meshTextures.end(),
    emissionTextures.begin(),
    emissionTextures.end()
);
if (emissionTextures.size() > 0) {
    meshMaterial.emissionTexture = emissionTextures[0];
}

其中loadTextures()只是一个函数,它获取mtl文件中与aiTextureType相对应的纹理路径,并从文件中加载它们,或者如果之前已加载它们,则从缓存中获取它们。除了发射纹理之外,这对于除了发射纹理之外的所有东(另外,原谅检查向量长度和抓住第一个长度的hacky方法,我需要找出一种更好的方法来检查将来是否加载了该类型的纹理。)

我认为aiTextureType aiTextureType_EMISSIVE可能与mtl map_Ke标签没有正确对应?这可以解释为什么我的ResourceManager甚至都没有尝试加载它。

我应该在这里检查aiTextureType_EMISSIVE正确的事吗?如果没有,我应该如何检查我的obj文件中相应材料文件的发射图?

1 个答案:

答案 0 :(得分:0)

这是已知的assimp(https://github.com/assimp/assimp/issues/804)错误已解决。但是,如果您和我一样并且版本较旧,则map_Ke代码不会映射到aiTextureType_EMISSIVE。解决方案是在.mtl文件中使用关键字map_emissive,该关键字可以识别自发光纹理(在早期版本中,它处理两个关键字)