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

时间:2013-07-26 00:01:02

标签: arrays glsl webgl shader uniform

试图像这样做: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。如果我尝试灯[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。

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

我做错了什么?如何传递到着色器制服阵列?

2 个答案:

答案 0 :(得分:8)

这些答案都使用函数uniform3fvv中的vector

所以你应该使用uniform1fv而不是uniform1f来制作制服。将来,请在阅读答案时更加小心。或者如果不这样做,请在提问之前检查您的OpenGL错误。

答案 1 :(得分:0)

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

};