Compiler errors 三.程序错误X6077
使用THREE.ShaderLib中预定义的法线贴图着色器时出错。显示我的材质,但未应用置换贴图。如果设置uDisplacementScale或uDisplacementBias,它将应用于整个对象,而不仅仅是在置换纹理中标记的部分 这是我的密码:Compiler errors 三.程序错误X6077,compiler-errors,three.js,webgl,shader,Compiler Errors,Three.js,Webgl,Shader,使用THREE.ShaderLib中预定义的法线贴图着色器时出错。显示我的材质,但未应用置换贴图。如果设置uDisplacementScale或uDisplacementBias,它将应用于整个对象,而不仅仅是在置换纹理中标记的部分 这是我的密码: var geometry = // some geometry ... geometry.computeVertexNormals(); geometry.computeTangents(); var shader = THREE.ShaderLi
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中的预定义几何体具有segments参数,允许用户将几何体的部分细分为多个线段,从而在生成的网格中创建不仅仅是轮廓顶点 这不适用于置换贴图:
var geometry = new THREE.PlaneGeometry(100,100);
这将为置换贴图生成足够的顶点:
var geometry = new THREE.PlaneGeometry(100,100,100,100);
因此,最终,错误X6077仍然发生,并且不是位移映射失败的原因。事实上,在某些浏览器中,如Chrome浏览器中,这似乎根本不存在。可能的副本请看一看。完全相同的问题。我已经看了一遍,我认为我的代码的行为与答案中提供的代码非常相似——但我仍然得到了错误。我遗漏了什么吗?@gaitat-另一篇文章中的重要内容是使用computeTangents和指定灯光:在ShaderMaterial参数中为true。这些更改已经在我的代码中完成。尽管如此,还是出现了错误。有没有进一步的想法,有什么不对劲的地方?你能创建一个小提琴或张贴你的代码吗?