【发布时间】:2024-05-02 09:00:02
【问题描述】:
使用来自THREE.ShaderLib 的预定义normalmap 着色器时出现错误。我的材质出现了,但没有应用置换贴图。如果我设置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 的代码点?还是它们是由另一个与所描述的错误无关的错误引起的?
【问题讨论】:
-
看看*.com/questions/25889688。完全相同的问题。
-
我已经看过了,我认为我的代码的行为与答案中提供的代码非常相似 - 但我仍然收到错误消息。我错过了什么吗?
-
@gaitat - 另一篇文章中的重要内容是使用
computeTangents()并在 ShaderMaterial 参数中指定lights : true。这些更改已经在我的代码中完成。尽管如此,错误还是发生了。任何进一步的想法,可能是什么问题? -
您可以创建一个小提琴或将您的代码发布到某处吗?
标签: compiler-errors three.js webgl shader