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