GLSL為不同的渲染階段定義了一些特定的變數。這些預定義(也叫做內建變數)有特定的屬性。所有的預定義變數都以gl_開頭。使用者定義的變數不能以此開頭。
下面分類進行介紹。
(1)頂點著色器輸入
in int gl_VertexID;
in int gl_InstanceID;
gl_VertexID是當前被處理的頂點的索引。對於array rendering,它是當前頂點在數組中的索引;對於indexed rendering,它是從element buffer中擷取的索引值。
gl_InstanceID指出了當前被渲染的instance,當使用instancedrendering的時候。
(2)頂點著色器輸出
out gl_PerVertex
{
vec4gl_Position;
floatgl_PointSize;
float gl_ClipDistance[];
}
為輸出定義了一個block介面。
gl_Position是當前頂點的輸出座標(如果沒有幾何著色器,是在clip-space)。指定這個值並不是必須的。但是不指定可能會導致意想不到的結果。如果你使用轉換反饋或者是關閉了光柵化,或者是使用採用使用者定義輸出產生座標的幾何著色器,則可以忽略指定這個值。
gl_PointSize指定了點的寬度和高度。只有在繪製點的時候指定它的值才是必須的。
gl_ClipDistance允許著色器設定一個頂點到每個剪下平面的距離。正值表示頂點在剪下平面的裡面(後面),而負值表示在剪下平面的外面(前面)。
(3)幾何著色器輸入
in gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
} gl_in[];
in int gl_PrimitiveIDIn;
gl_PerVertex包含了從前面的頂點著色器傳送過來的值。
注意:在幾何著色器中,他們有首碼gl_in,是一個block的數組。這個數組的大小依賴於用於這個幾何著色器的輸入的layout關鍵詞。使用者不用以一個特定的大小重新聲明這個block,系統會自動完成。可以用函數length()獲得其大小。
gl_PrimitiveIDIn是在這次渲染過程中的圖元數量,即先前被glDraw()調用所處理的圖元數量。
GLSL4.00及其以上版本還有以下定義:
in int gl_InvocationID;
幾何著色器可以被調用多次,這個值指定了當前調用。
(4)幾何著色器輸出
out gl_PerVertex
{
vec4 gl_Position;
float gl_PointSize;
float gl_ClipDistance[];
};
out int gl_PrimitiveID;
out int gl_Layer;
gl_PerVertex和頂點著色器階段有相同的意義。
gl_PrimitiveID是圖元的使用者定義標識符。它直接被傳送到片斷著色器。如果片斷著色器使用了它的相關輸入但是幾何著色器又沒有指定它的值,那麼它的值就是預定義的(如果沒有幾何著色器OpenGL會自動產生)。
gl_Layer用於渲染到layeredframebuffer objects,指定了特定圖元要被渲染到的layer。
GLSL4.10還定義了如下輸出:
out int gl_ViewportIndex;
它代表了當前圖元要被採用得視口變換了裁剪測試。使用和gl_Layer類似。
(5)片斷著色器輸入
in vec4 gl_FragCoord;
in bool gl_FrontFacing;
in float gl_ClipDistance[];
in vec2 gl_PointCoord;
in int gl_PrimitiveID;
gl_FragCoord包含了當前片斷的window-space座標。如果入戶沒重載它,其Z分量是要寫入到深度緩衝區的。其W分量是1/Wclip(Wclip是頂點或幾何著色器的輸出gl_Position的W分量)
gl_FrontFacing:如果圖元從其前面觀看,則為真,否則為假。
gl_ClipDistance包含了頂點著色器的輸出,不過是依據圖元進行線性插值後的。
gl_PointCoord:點內部的位置,指定了片斷的位置。它是被歸一化了的值,位於[0,1]。(0,0)原點位置依賴於OpenGL的點座標設定,預設是在左下角。
gl_PrimitiveID是幾何著色器的輸出,如果沒有使用幾何著色器,由OpenGL產生。代表了被光柵化的圖元索引。
GLSL4.00增加了一下輸入:
in int gl_SampleID;
in vec2 gl_SamplePosition;
in int gl_SampleMaskIn[];
指定了像素地區sample的一些屬性。
(6)片斷著色器全域變數
struct gl_DepthRangeParameters
{
float near;
float far;
float diff;
};
uniform gl_DepthRangeParameters gl_DepthRange;
這個struct提供了對glDepthRange近、遠值的訪問。diff等於far和near的差。
(7)片斷著色器輸出
out float gl_FragDepth;
它是要被寫入到深度緩衝區的值。也將被用於深度測試。片斷著色器不一定要指定它的值。它可能被gl_FragCoord.z.自動填滿。需要注意的是:如果在某處指定,在其他地方也必須要進行指定。
GLSL4.00增加了如下輸出:
out int gl_SampleMask[];
當採用多重採樣渲染時,它會被寫入。