尝试执行如下操作:将数组传递到着色器就像这里:将矢量数组传递给统一的
但仍然没有运气。我想我只是喜欢那里,但它不起作用:
这是我的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){
};