如何使用Assimp在gltf格式中加载粗糙度/金属贴图?

7

我尝试加载一个以 gltf 格式存储的场景。它包含了金属度和粗糙度贴图(非嵌入式)。现在,我想使用 Assimp 加载具有指定贴图的模型。我使用 GetTexture() 检索贴图,但是 aiTextureType 没有粗糙度/金属度的成员。

因此问题来了: 我该如何导入它们?由于 Assimp 支持 gltf,它必须以某种方式支持基于物理的材质贴图。

谢谢

4个回答

7
自 Assimp 5.1.0 版本开始,引入了通用的PBR材质属性,即使对于非glTF文件也可以使用:
// for some formats (like glTF) metallic and roughness may be the same file
aiString fileBaseColor, fileMetallic, fileRoughness;
material->GetTexture(AI_MATKEY_BASE_COLOR_TEXTURE, &fileBaseColor);
material->GetTexture(AI_MATKEY_METALLIC_TEXTURE, &fileMetallic);
material->GetTexture(AI_MATKEY_ROUGHNESS_TEXTURE, &fileRoughness);

完整列表请查看:https://github.com/assimp/assimp/blob/v5.1.4/include/assimp/material.h#L972


旧回答:(自Assimp 5.1.0起已停用)

对于GLTF PBR材质,您可以使用pbrmaterial.h中定义的材质键。

#include <assimp/pbrmaterial.h>

aiString fileBaseColor, fileMetallicRoughness;
material->GetTexture(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_TEXTURE, &fileBaseColor);
material->GetTexture(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE, &fileMetallicRoughness);

2
如果有人遇到同样的问题: GetTexture(aiTextureType_UNKNOWN) 返回 PBR 纹理的路径。

你好,你知道这是哪种纹理吗?是漫反射贴图吗?还是粗糙度/金属贴图? - Amine Bensalem

2

0

那么获取 aiTextureType_UNKNOWN(或最有可能的是 AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE )是没有更好的选择了,因为在gltf中金属和粗糙度纹理都在相同的材质属性 metallicRoughnessTexture 中指定。就像这样:

  "images": [
    {
      "uri": "textures/DefaultMaterial_metallicRoughness.png"
    },
    {
      "uri": "textures/DefaultMaterial_baseColor.jpeg"
    },
    {
      "uri": "textures/DefaultMaterial_normal.png"
    }
  ],
  "materials": [
    {
      "doubleSided": true,
      "emissiveFactor": [
        0,
        0,
        0
      ],
      "name": "DefaultMaterial",
      "normalTexture": {
        "index": 2,
        "scale": 1,
        "texCoord": 0
      },
      "pbrMetallicRoughness": {
        "baseColorFactor": [
          1,
          1,
          1,
          1
        ],
        "baseColorTexture": {
          "index": 1,
          "texCoord": 0
        },
        "metallicFactor": 1,
        "metallicRoughnessTexture": {
          "index": 0,
          "texCoord": 0
        },
        "roughnessFactor": 0.86756859760000005
      }
    }
  ],

我尝试了:

material->GetTexture(AI_MATKEY_METALLIC_TEXTURE, &fileMetallic);
material->GetTexture(AI_MATKEY_ROUGHNESS_TEXTURE, &fileRoughness);

使用Assimp 5.2.2,但它无法处理我的glTF测试文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接