首页 > 解决方案 > 使用着色器材质的标准材质。USE_MAP 突然停止工作,“maptexelToLinear;找不到匹配的重载函数”

问题描述



我正在使用来自 github 的最新 three.js 构建,它是前一天晚上更新的。

该代码几天前有效,但没有更改昨天停止工作的代码。maptexelToLinear; no matching overloaded function found它在 map_fragment shaderChunk 的第 6 行给出错误消息:

vec4 texelColor = texture2D( map, vUv );
texelColor = mapTexelToLinear( texelColor ); //here

有什么改变吗?这仍然是从着色器材质创建标准材质的正确方法吗?使用定义、扩展和映射统一?

https://jsfiddle.net/EthanHermsey/c4sea1rg/119/

    let texture = new THREE.TextureLoader().load(

        document.getElementById( 'blockDiff' ).src

    );


    // this works fine
    /* let mat = new THREE.MeshStandardMaterial( {

           map: texture

    } ) */



    // this does not
    let mat = new THREE.ShaderMaterial( {

        //custom shaders
        // vertexShader: document.getElementById( 'blockVertexShader' ).textContent,
        // fragmentShader: document.getElementById( 'blockFragmentShader' ).textContent,

        //The standard shaders do not even work :/
        vertexShader: THREE.ShaderLib[ 'standard' ].vertexShader,
        fragmentShader: THREE.ShaderLib[ 'standard' ].fragmentShader,

        uniforms: THREE.UniformsUtils.merge( [

            THREE.ShaderLib[ 'standard' ].uniforms,
            {

                blockScale: { value: new THREE.Vector3() } // used in custom shaders

            }

        ] ),

        defines: {

            "STANDARD": '',
            "USE_UV": '',
            "USE_MAP": ''

        },

        lights: true

    } );

    mat.uniforms.map.value = texture;

    mat.extensions.derivatives = true;
    mat.uniformsNeedUpdate = true;
    

标签: three.js

解决方案


在以前的three.js版本中实际上存在一个错误,maptexelToLinear()将错误的实现注入到着色器代码中。此问题已通过r118. 但是,它要求用户代码中的自定义着色器材质具有名为map.

更新代码:https ://jsfiddle.net/og8Lmp6e/

通过这种方式,也没有必要像USE_MAPUSE_UV不再设置自定义定义。这是自动发生的。当然maptexelToLinear()now 的实现尊重你的纹理的编码。

顺便说一句:实际上最好使用Material.onBeforeCompile()修改内置材质。


推荐阅读