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



尝试执行如下操作:将数组传递到着色器就像这里:将矢量数组传递给统一的

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

这是我的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

摘要:我发送的不是数组,而是float 3.0。

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

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

这些答案都使用函数uniform3fv。如CCD_ 3中的CCD_。

所以您应该使用uniform1fv,而不是uniform1f来处理制服阵列。

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

最新更新