c++ - Assimp 加载发射图

标签 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 对应的纹理路径,如果之前已经加载过,则可以从文件中加载它们,也可以从缓存中获取它们.同样,这对除发射纹理之外的所有内容都完全有效。 (另外,请原谅检查 vector 长度并获取第一个 vector 的笨拙方法,我需要找出一种更好的方法来检查将来是否已加载该类型的纹理)。

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

aiTextureType_EMISSIVE 是我应该在此处检查的正确内容吗?如果不是,我应该如何检查我的 obj 文件中对应的 Material 文件中的发射贴图?

最佳答案

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

关于c++ - Assimp 加载发射图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40827314/

相关文章:

c++ - #include <windows.h> 导致很多语法错误

c++ - Assimp 无法在 Code::Blocks 中正确构建 - "TVITEMEXW not declared in current scope"

c++ - 根据内容更改文本框的颜色

c++ - 使用 mpl::vector 作为函数表

c++ - 如何将句柄添加为类成员,其中类用于堆模板?

c++ - 函数返回后指向无效内容的指针

c++ - Assimp 不在 OpenGL 中的 MD5 模型 Bob 的节点中加载骨骼名称

c++ - 构造函数中变量初始化的正确顺序

opengl - 多 View 视锥体裁剪

c++ - glvertexpointer std::vector, struct memory opengl