2015-05-26 28 views
0

在我編碼的程序中,我必須生成多個光源並傳遞給着色器。由於這個數字是在着色器之外定義的,我通過uniform int來傳遞它,並用它來聲明數組的大小。在基於統一int的GLSL中聲明數組

uniform int numLights; 
uniform vec4 ambientColor; 
uniform vec4 specularColor; 
uniform vec3 diffuseColor[numLights]; 
uniform vec3 vLightPosition[numLights]; 

不過,我現在得到了很多的錯誤:

enter image description here

我不能這樣做呢?例如,我正在考慮改變預定義燈光的數量並忘記更新着色器的可能性。我試圖阻止這種事情發生。

+0

[(OpenGL 3.1 - 4.2)Dynamic Uniform Arrays的可能重複?](http://stackoverflow.com/questions/9916103/opengl-3-1-4-2-dynamic-uniform-arrays) – Axalo

+0

真的不要不知道你是如何通過這個問題展示的,@Axalo。 :S – pceccon

+0

'uniform vec3 diffuseColor [numLights];'numLights必須是一個不是統一的常量。 – Axalo

回答

1

GLSL遵循C規則,在編譯時必須知道數組大小。

GLSL有一個預處理器,但無法提供除源代碼之外的預處理器值。因此,您需要生成合適的#define語句作爲字符串,並在爲該着色器提供源之前將它們提供給glShaderSource - 在編譯之前對glShaderSource的調用將累積傳遞給它們的所有文本,因此與額外字符串的前綴相同你的源文件。

然後,您每次更改燈光數量時都需要重新編譯,而不僅僅是提供統一的燈光。