WebGL:将统一数组传递给着色器

13

尝试按照这里:Pass array to shader 和这里:Passing an array of vectors to a uniform的方法来操作。

但是还是没有成功。我认为我按照那里的方法做了,但不起作用:

这是我的JavaScript代码:

shaderProgram.lightsUniform = gl.getUniformLocation(shaderProgram, "lights"); // Getting location
gl.uniform1f(shaderProgram.lightsUniform, new Float32Array([3,1,2,3,4,5])); // Let's try to send some light (currently each light is one float) as array.

顶点着色器代码:

uniform float lights[6]; // Declaration

...

vLight *= lights[0]; // Let's try to mutliply our light by the first array item. There should be 3.0.

摘要:我向着着色器发送一个具有非零浮点数的数组。

结果:完全是黑的!也就是说,lights [0] 包含 0.0,但期望为 3.0。如果我尝试 lights [1]、lights [2] 等,它们都会给出相同的结果!

现在让我们尝试只传递一个浮点数。我做出了改变

gl.uniform1f(shaderProgram.lightsUniform, new Float32Array([3,1,2,3,4,5])); 

gl.uniform1f(shaderProgram.lightsUniform, 3); // I want to send just float 3.0

摘要: 我没有发送数组,而是只发送了浮点数3.0。

结果:有效!lights[0] 包含 3.0(但我只发送了一个浮点数,而不是一个数组)。

我做错了什么?我如何将一组 uniform 传递给着色器?

2个回答

10

所有这些答案都使用了函数uniform3fvv表示vector

因此,对于uniforms数组,您应该使用uniform1fv,而不是uniform1f


我遇到了类似的问题。但是当我改用uniform1fv时,我得到了以下控制台错误:在WebGLRenderingContext上执行' uniform1fv '失败:找不到与提供的签名匹配的函数。 - InfiniteStack
27
在提问之前,请检查您的OpenGL错误。这是一个具有挑战性的领域,可能会让人感到非常压抑。这个问题表述得很好,回答也很直接有帮助,这正是StackOverflow的意义所在。没有理由告诉别人他们不应该提出问题。 - Matthew

-3

1: 确保你的if语句在一个函数内部。

2: 确保在声明uniform之前设置了精确度(precision)

      #ifdef GL_FRAGMENT_PRECISION_HIGH
        precision highp float;
      #else
        precision mediump float;
      #endif
      precision mediump int;

3:确保比较的类型正确:

这将失败

uniform vec3 neon_whatever;
if(neon_whatever.x == 0){

};

这个会失败:
uniform vec3 neon_whatever;
if(neon_whatever == 0.0){

};

这将有效

uniform vec3 neon_whatever;
if(neon_whatever.x == 0.0){

};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接