使用预定义的 normalmap
时出现错误来自 THREE.ShaderLib
的着色器.我的 Material 出现了,但没有应用置换贴图。如果我设置 uDisplacementScale
或 uDisplacementBias
制服,它被应用于完整的对象,而不仅仅是在我的置换纹理中标记的部分。
这是我的代码:
var geometry = // some geometry ...
geometry.computeVertexNormals();
geometry.computeTangents();
var shader = THREE.ShaderLib["normalmap"];
var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
uniforms[ "enableAO" ].value = true;
uniforms[ "enableDiffuse" ].value = true;
uniforms[ "enableSpecular" ].value = true;
uniforms[ "enableReflection" ].value = false;
uniforms[ "enableDisplacement" ].value = true;
uniforms[ "tDisplacement" ].value = THREE.ImageUtils.loadTexture( "textures/tex_DISP.png" );
uniforms[ "tDiffuse" ].value = THREE.ImageUtils.loadTexture( "textures/tex_COLOR.png" );
uniforms[ "tNormal" ].value = THREE.ImageUtils.loadTexture( "textures/tex_NRM.png" );
uniforms[ "tSpecular" ].value = THREE.ImageUtils.loadTexture( "textures/tex_SPEC.png" );
uniforms[ "tAO" ].value = THREE.ImageUtils.loadTexture( "textures/tex_OCC.png" );
var shaderParams = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: false };
var material = new THREE.ShaderMaterial( shaderParams );
var mesh = new THREE.Mesh(geometry, material);
这是错误:
(63,12): error X6077: texld/texldb/texldp/dsx/dsy instructions with r# as source cannot
be used inside dynamic conditional 'if' blocks, dynamic conditional subroutine calls,
or loop/rep with break*.
Warning: D3D shader compilation failed with
default
flags.
Retrying with
avoid flow control
.
错误消息中描述的语句类型是否适用于着色器代码,或适用于我初始化
THREE.ShaderMaterial
的代码点? ?还是它们是由另一个错误引起的,与所描述的错误无关?
最佳答案
使用法线贴图着色器不会添加额外的顶点来应用置换贴图 - 它只会将高度应用于现有顶点。
所以,失败是,我没有在我的网格中提供足够的顶点。解决方案是使用更详细的几何图形。例如,three.js 中的预定义几何具有段参数,允许用户将几何的部分分割为多个段,从而在生成的网格中创建的不仅仅是轮廓顶点。
这不适用于置换贴图:
var geometry = new THREE.PlaneGeometry(100,100);
这将为置换贴图生成足够的顶点:
var geometry = new THREE.PlaneGeometry(100,100,100,100);
所以,最后,错误 X6077 仍然发生,并且不是导致失败的位移映射的原因。实际上,它似乎根本不会出现在某些浏览器中,例如 Chrome。
关于compiler-errors - 三.WebGL程序错误X6077,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25916246/