Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler errors 三.程序错误X6077_Compiler Errors_Three.js_Webgl_Shader - Fatal编程技术网

Compiler errors 三.程序错误X6077

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

使用THREE.ShaderLib中预定义的法线贴图着色器时出错。显示我的材质,但未应用置换贴图。如果设置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中的预定义几何体具有segments参数,允许用户将几何体的部分细分为多个线段,从而在生成的网格中创建不仅仅是轮廓顶点

这不适用于置换贴图:

var geometry = new THREE.PlaneGeometry(100,100);
这将为置换贴图生成足够的顶点:

var geometry = new THREE.PlaneGeometry(100,100,100,100);

因此,最终,错误X6077仍然发生,并且不是位移映射失败的原因。事实上,在某些浏览器中,如Chrome浏览器中,这似乎根本不存在。

可能的副本请看一看。完全相同的问题。我已经看了一遍,我认为我的代码的行为与答案中提供的代码非常相似——但我仍然得到了错误。我遗漏了什么吗?@gaitat-另一篇文章中的重要内容是使用computeTangents和指定灯光:在ShaderMaterial参数中为true。这些更改已经在我的代码中完成。尽管如此,还是出现了错误。有没有进一步的想法,有什么不对劲的地方?你能创建一个小提琴或张贴你的代码吗?