有些opengl es操作在頂點處理器和片元處理器之間有特定的功能,有些在片元處理器之後又特定的功能,著色器通過內建變數同這些固定功能進行通訊。
在opengl es中,內建特殊變數部分來自頂點著色器的輸出變數,部分來自於片元著色器的輸入變數和輸出變數。不同於使用者定義的varying變數,內建特殊變數不用在頂點語言和片元語言之間保持嚴格的一對一對應。相反,兩個語言各有自己的一套變數集合。
變數gl_position僅可用在頂點語言中,並且用來寫入奇次頂點位置。所有符合語法規則的頂點著色器都應該給該變數寫入乙個值。可以在著色器執行期間的任何時候給它寫入新值,也可以隨時讀取它的值。這個值可以用在頂點處理開始之後的圖元裝配,剪裁,剔除和其他操作圖元的固定功能上。如果檢測到gl_position沒有被寫入,或者在寫入前被讀取,編譯器會產生乙個診斷資訊,但是並不是所有的情況都能檢測的到。如果頂點著色器已經執行,但是並沒有寫入gl_position,那麼gl_position的值是未定義的。
gl_pointsize也是只能用在頂點語言中,頂點著色器用它來寫入將要光柵化的點的尺寸,單位是畫素。
用來與特定功能通訊的內建頂點著色器變數本質上是按照如下方式宣告的:
highp vec4 gl_position; // should be written to如果這些值沒有被寫入過,那麼它們的值是未定義的。著色器在給它們寫入值之後也可以將它們的值讀取出來以重新獲取寫入的值。如果被多次寫入過值,最近寫入的值有效。mediump float gl_pointsize; // may be written to
這些內建變數具有全域性作用域。
片元著色器的輸出值由opengl es管線的後端固定函式進行處理。片元著色器使用gl_fragcolor和gl_fragdata內建變數向opengl es管線輸出值,除非關鍵字discard被執行。
對於片元著色器來說,向gl_fragcolor和gl_fragdata寫入值不是必要的。許多演算法,如陰影體,包含未被寫入顏色值的渲染通道。
在片元著色器中這些變數可能會被寫入多次。如果這樣的話,在後續的固定功能管線中使用的就是最後一次被賦的值。這些變數可以在寫入值之後隨時將值讀取出來。如果在讀取之前沒有被寫入值的話,那麼將得到乙個未定義的值。
寫入gl_fragcolor是為了指明隨後固定功能管線要用到的片元顏色值。如果後續固定功能管線要使用這個片元顏色值,但是著色器又沒有給它寫入值,那麼片元顏色值將是乙個未定義的值。
gl_fragdata變數值是乙個陣列。向gl_fragdata[n]寫入資料時為了指明後續固定功能管線要使用的片元資料n。如果後續固定功能管線要使用這個片元資料,但是著色器又沒有給它寫入值,那麼片元資料將是乙個未定義的值。
如果著色器靜態地給gl_fragcolor賦值,那麼它就不會給gl_fragdata的任何元素賦值。如果著色器靜態地給gl_fragdata的任何元素賦值,那麼它就不會給gl_fragcolor賦值。也就是說,著色器不會同時給gl_fragcolor和gl_fragdata變數都賦值。
(如果著色器包含對變數x的靜態賦值,在預處理之後,著色器包含乙個向x寫入值的語句,不論如何,執行時控制流都會執行該語句。)
如果著色器執行了discard關鍵字,片元將被直接扔掉,gl_fragcolor和gl_fragdata的值也會變得毫不相干。
gl_fragcoord是片元著色器中的唯讀變數,它儲存了片元相對視窗的座標位置:x, y, z, 1/w。這個值是頂點處理產生片元後固定功能內插圖元的結果。元件z是用於表示片元深度的深度值。
gl_frontfacing是片元著色器的內建唯讀變數,如果片元屬於乙個當前圖元,那麼這個值就為true。這個變數的乙個用法就是來模擬兩面光,通過選擇由頂點著色器計算的兩個顏色中的乙個。
gl_pointcoord是片元著色器的內建唯讀變數,它的值是當前片元所在點圖元的二維座標。點的範圍是0.0到1.0。如果當前的圖元不是乙個點,那麼從gl_pointcoord讀出的值是未定義的。
片元著色器的內建變數本質上的宣告形式如下:
mediump vec4 gl_fragcoord;它們的行為並不像沒有儲存修飾符的變數;這些內建變數擁有全域性作用域。bool gl_frontfacing;
mediump vec4 gl_fragcolor;
mediump vec4 gl_fragdata[gl_maxdrawbuffers];
mediump vec2 gl_pointcoord;
opengl es中沒有內建屬性值。
頂點和片元著色器提供了如下內建常量:
//為了方便訪問opengl es處理狀態,opengl es定義了以下uniform變數。如果片言語言的某個實現不支援highp,並且羅列的狀態又是highp,那麼片元語言將其作為mediump處理。// 相關常量實現。下面的示例值是這些最大值所允許的最小值。
//const mediump int gl_maxvertexattribs = 8;
const mediump int gl_maxvertexuniformvectors = 128;
const mediump int gl_maxvaryingvectors = 8;
const mediump int gl_maxvertextextureimageunits = 0;
const mediump int gl_maxcombinedtextureimageunits = 8;
const mediump int gl_maxtextureimageunits = 8;
const mediump int gl_maxfragmentuniformvectors = 16;
const mediump int gl_maxdrawbuffers = 1;
//// 視窗座標的深度範圍
//struct gl_depthrangeparameters ;
uniform gl_depthrangeparameters gl_depthrange;
GLSL 內建變數
有些opengl es操作在頂點處理器和片元處理器之間有特定的功能,有些在片元處理器之後又特定的功能,著色器通過內建變數同這些固定功能進行通訊。在opengl es中,內建特殊變數部分來自頂點著色器的輸出變數,部分來自於片元著色器的輸入變數和輸出變數。不同於使用者定義的varying變數,內建特殊變...
GLSL語言內建的變數詳解
glsl語言內建的變數,包括內建的頂點屬性 attribute 一致變數 uniform 易變變數 varying 以及常量 const 一方面加深印象,另一方面今天的文章可以為以後的程式設計做查詢之用。頂點屬性 指頂點的資訊,opengl據此繪製各個圖元,對於傳統的頂點屬性包括座標 紋理座標 顏色...
GLSL學習筆記 之內置變數2
有些opengl es操作在頂點處理器和片元處理器之間有特定的功能,有些在片元處理器之後又特定的功能,著色器通過內建變數同這些固定功能進行通訊。在opengl es中,內建特殊變數部分來自頂點著色器的輸出變數,部分來自於片元著色器的輸入變數和輸出變數。不同於使用者定義的varying變數,內建特殊變...