compiler-errors - 三.WebGL程序错误X6077

标签 compiler-errors three.js webgl shader

使用预定义的 normalmap 时出现错误来自 THREE.ShaderLib 的着色器.我的 Material 出现了,但没有应用置换贴图。如果我设置 uDisplacementScaleuDisplacementBias制服,它被应用于完整的对象,而不仅仅是在我的置换纹理中标记的部分。

这是我的代码:

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/

相关文章:

java - 为什么编译器声明不存在唯一的最大实例?

javascript - 单击可放大 WebGL

c# - 如何修复显示 “The type or namespace name X does not exist in the namespace Y”的错误?

c++ - 使用 ANDROID NDK 在 Cplusplus 中调用 ffmpeg1.2.1 时出现 "undefined reference to "

javascript - 改变鼠标位置

javascript - 三.js对象转数组

three.js - 解决 Three.js/webGL 中的 gl_PointSize 限制

Three.js - 将不同的 Material 应用于挤压形状

glsl - webGL 中的平面着色

Java 比较相等的 double 值但得到错误的结果。程序永远不会结束