如何向 GLTF 模型添加光泽度/镜面反射纹理?

Posted

技术标签:

【中文标题】如何向 GLTF 模型添加光泽度/镜面反射纹理?【英文标题】:How can I add a glossiness / specular texture to a GLTF model? 【发布时间】:2019-01-21 16:11:42 【问题描述】:

问题:

我有一个尚未被 GLTF 模型使用的模型的镜面反射/光泽度纹理图像。

如何在模型中使用/添加纹理,使其在应有的位置具有反射/光泽?

我不知道要在 .gltf 文件中进行哪些更改才能使用纹理。

编辑:添加了更多的 GLTF 行,以便更好地了解情况。


GLTF JSON:

"images": [
    
        "name": "...",
        "uri": "..."
    ,
    
        "name": "...",
        "uri": "..."
    ,
    
        "name": "...",
        "uri": "..."
    ,
    
        "name": "...",
        "uri": "..."
    ,
    
        "name": "...",
        "uri": "..."
    
],
"samplers": [
    
],
"textures": [
    
        "name": "T_N",
        "sampler": 0,
        "source": 0
    ,
    
        "name": "Map #9",
        "sampler": 0,
        "source": 1
    ,
    
        "name": "T_D",
        "sampler": 0,
        "source": 2
    ,
    
        "name": "Map #6",
        "sampler": 0,
        "source": 3
    ,
    
        "name": "Specular",
        "sampler": 0,
        "source": 4
    
],

"materials": [
    
        "name": "Head",
        "alphaMode": "OPAQUE",
        "extras": 
            "fromFBX": 
                "shadingModel": "<unknown>",
                "isTruePBR": false
            
        ,
        "normalTexture": 
            "index": 0,
            "texCoord": 0
        ,
        "emissiveTexture": 
            "index": 1,
            "texCoord": 0
        ,
        "pbrMetallicRoughness": 
            "baseColorTexture": 
                "index": 2,
                "texCoord": 0
            ,
            "baseColorFactor": [
                1.0,
                1.0,
                1.0,
                1.0
            ],
            "metallicFactor": 0.800000002980232,
            "roughnessFactor": 0.600000011920929
        
    ,
    
        "name": "Body",
        "alphaMode": "BLEND",
        "extras": 
            "fromFBX": 
                "shadingModel": "<unknown>",
                "isTruePBR": true
            
        ,
        "pbrMetallicRoughness": 
            "baseColorTexture": 
                "index": 3,
                "texCoord": 0
            ,
            "baseColorFactor": [
                1.0,
                1.0,
                1.0,
                1.0
            ],
            "metallicFactor": 0.80000002980232,
            "roughnessFactor": 0.600000011920929
        ,
        "extensions": 
            "KHR_materials_pbrSpecularGlossiness": 
                "specularGlossinessTexture": 
                    "index": 4
                
            
        
    
],
"meshes": [
    
        "name": "Head",
        "primitives": [
            
                "material": 0,
                "mode": 4,
                "attributes": 
                    "COLOR_0": 3,
                    "NORMAL": 2,
                    "POSITION": 1,
                    "TEXCOORD_0": 4
                ,
                "indices": 0,
                "extensions": 
                    "KHR_draco_mesh_compression": 
                        "bufferView": 0,
                        "attributes": 
                            "COLOR_0": 2,
                            "NORMAL": 1,
                            "POSITION": 0,
                            "TEXCOORD_0": 3
                        
                    
                
            
        ]
    ,
    
        "name": "Body",
        "primitives": [
            
                "material": 1,
                "mode": 4,
                "attributes": 
                    "COLOR_0": 8,
                    "NORMAL": 7,
                    "POSITION": 6,
                    "TEXCOORD_0": 9
                ,
                "indices": 5,
                "extensions": 
                    "KHR_draco_mesh_compression": 
                        "bufferView": 1,
                        "attributes": 
                            "COLOR_0": 2,
                            "NORMAL": 1,
                            "POSITION": 0,
                            "TEXCOORD_0": 3
                        
                    
                
            
        ]
    
],

错误:

这是我在尝试加载模型时使用上述修改后的 GLTF 时遇到的错误:

"message":"Cannot read property 'getMaterialType' of undefined","name":"TypeError" 

【问题讨论】:

【参考方案1】:

glTF-Sample-Models 存储库中有一些很好的示例。这是使用两种不同 PBR 工作流程的相同模型:

spec/gloss PBR material metal/rough PBR material

您上面的示例 JSON 使用的是金属/粗糙,因此您必须通过将金属和粗糙度因子替换为等效的规格/光泽属性来将其“转换”为规格/光泽。

我建议查看规范以获取更多信息:

glTF specification spec/gloss extension

您可能还会发现在 Substance Painter 或 Blender 等工具中更容易做到这一点,它们可以导入和导出 glTF。

【讨论】:

我打赌以下错误:"message":"Cannot read property 'getMaterialType' of undefined","name":"TypeError" 添加字段后:github.com/KhronosGroup/glTF-Sample-Models/blob/master/2.0/… 在问题中更新了我当前的 GLTF 文件,其中包含更改和更多行。 您知道导致错误的原因吗? 我认为您需要使用 Google Drive 或 Dropbox 或其他工具发布整个 glTF 文件。 glTF“验证”工具也可以提供帮助。 我验证了文件,现在我得到了与这里完全相同的错误:***.com/questions/51839039/… 我不知道是什么原因造成的......

以上是关于如何向 GLTF 模型添加光泽度/镜面反射纹理?的主要内容,如果未能解决你的问题,请参考以下文章

如何向我的 openGL 程序添加多个纹理?

一步步学Metal图形引擎7-《镜面反射》

一步步学Metal图形引擎7-《镜面反射》

三维模型反射光照射实现物体表面高光实现(WebGL进阶04)

如何从 GLTF 模型动态覆盖纹理 - Three.js

三.js gltf模型变灰无纹理,改纹理后