我正在使用来自 github 的最新的three.js 版本,它是在前一天晚上更新的。
这段代码几天前可以工作,但没有更改代码,昨天就停止工作了。它maptexelToLinear; no matching overloaded function found在 map_fragment shaderChunk 的第 6 行给出了错误信息:
vec4 texelColor = texture2D( map, vUv );
texelColor = mapTexelToLinear( texelColor ); //here
Run Code Online (Sandbox Code Playgroud)
有什么改变吗?这仍然是从着色器材料创建标准材料的正确方法吗?与定义,扩展和地图统一?
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;
Run Code Online (Sandbox Code Playgroud)
以前的three.js版本中实际上存在一个错误,将maptexelToLinear()错误的实现注入到着色器代码中。此问题已通过r118. 但是,它要求用户代码使您的自定义着色器材料具有名为map.
更新代码:https : //jsfiddle.net/og8Lmp6e/
通过这种方式,也没有必要像USE_MAP或USE_UV不再设置自定义定义。这会自动发生。当然,maptexelToLinear()now的实现尊重您的纹理编码。
顺便说一句:实际上最好使用Material.onBeforeCompile()修改内置材料。