2013-07-26 74 views
4

试图做的,就像这里:Pass array to shader 而像这里:Passing an array of vectors to a uniformWebGL的:通过统一的阵列着色器

但仍没有运气。我觉得我做的一样存在,但它不工作:

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

的Vertex Shader代码:

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. 

摘要:我送数组使用非零浮点着色器。

结果:全黑!即灯[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(但我发送只是浮动,而不是一个数组)。

我该怎么做?我如何传递给着色器阵列的制服?

回答

5

那些答案都使用函数uniform3fvvvector

所以你应该使用uniform1fv,而不是uniform1f阵列的制服。将来,请在阅读答案时加倍小心。否则,在提出问题之前检查OpenGL错误。

+0

感谢这有助于。 – Dmitry

+0

我遇到过类似的问题。但是,当我更改为uniform1fv时,出现以下控制台错误:未能在'WebGLRenderingContext'上执行'uniform1fv':找不到与提供的签名匹配的函数。 – InfiniteStack

0

1:确保您如果语句是功能内。

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

};