我正在使用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文件中相应材料文件的发射图?
答案 0 :(得分:0)
这是已知的assimp(https://github.com/assimp/assimp/issues/804)错误已解决。但是,如果您和我一样并且版本较旧,则map_Ke
代码不会映射到aiTextureType_EMISSIVE
。解决方案是在.mtl文件中使用关键字map_emissive
,该关键字可以识别自发光纹理(在早期版本中,它处理两个关键字)