2013-07-26 30 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){ 

};