11

尝试像这里一样:将数组传递给着色器 并且像这里:将向量数组传递给制服

但仍然没有运气。我想我只是喜欢那里,但它不起作用:

这是我的 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。如果我尝试灯光 [1]、灯光 [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,而不是发送数组。

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

我做错了什么?如何传递给制服的着色器数组?

4

2 回答 2

7

这些答案都使用了函数uniform3fvvvector.

所以你应该使用uniform1fv,而不是uniform1f制服数组。以后请大家在阅读答案时更加小心。否则,请在提问之前检查您的 OpenGL 错误。

于 2013-07-26T00:27:15.950 回答
-2

1:确保您的if语句在函数内。

2:在宣布制服之前确保设置精度。

      #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){

};
于 2017-11-30T01:29:24.820 回答