1. 程式人生 > >06 WebGL 著色器程式語言GLSL ES的陣列

06 WebGL 著色器程式語言GLSL ES的陣列

GLSL ES支援陣列型別。與JavaScript中的陣列不同的是,GLSL ES只支援一維陣列,而且陣列物件不支援pop()和push()等操作,建立陣列時也不需要使用new運算子。宣告陣列很簡單,值需要在變數名後加上中括號([])和陣列的長度。比如:

    float floatArray[4];//宣告含有4個浮點數元素的陣列
    vec4 vec4Array[2];//宣告含有2個vec4物件的陣列
陣列的長度必須是大於0的整型常量表達式,如下定義:

~整型字面量(如0或1)。

~用const限定字修飾的全域性變數或區域性變數,不包括函式引數。

~由前述兩條中的項組成的表示式。

因此,下面的程式碼將會出錯:

int size = 4;
vec4 vec4Array[size];//錯誤,如果第一行為const int size = 4;則不會出錯
注意,你不可以用const限定字來修飾陣列本身。

陣列元素可以通過索引值來訪問,和C語言一樣,索引值也是從0開始的。比如,下面這句程式碼就可以訪問floatArray變數的第3個元素:

float f = floatArray[2];
只有整型常量表達式和uniform變數可以被用作陣列的索引值。此外,與javascript或C不同,陣列不能在宣告時被一次性地初始化,而必須顯式地對每個元素進行初始化。如下所示:
vec4Array[0] = vec4(4.0,3.0,6.0,1.0);
vec4Array[1] = vec4(3.0,2.0,0.0,1.0);
陣列本身只支援[]運算子,但陣列的元素能夠參與其自身型別支援的任意運算。比如,floatArray和vec4Array的元素可以參與下面這些運算:
//將floatArray的第2個元素乘以3.14
float f = floatArray[1]*3.14;
//將vec4Array的第1個元素乘以vec4(1.0,2.0,3.0,4.0);
vec4 v4  = vec4Array[0]*vec4(1.0,2.0,3.0,4.0);