glsl為不同的渲染階段定義了一些特定的變數。這些預定義(也叫做內建變數)有特定的屬性。所有的預定義變數都以gl_開頭。使用者定義的變數不能以此開頭。
下面分類進行介紹。
(1)頂點著色器輸入
inint
gl_vertexid;
ingl_vertexid是當前被處理的頂點的索引。對於array rendering,它是當前頂點在陣列中的索引;對於indexed rendering,它是從element buffer中獲取的索引值。int
gl_instanceid;
gl_instanceid指出了當前被渲染的instance,當使用instancedrendering的時候。
(2)頂點著色器輸出
outgl_pervertex
為輸出定義了乙個block介面。
gl_position是當前頂點的輸出座標(如果沒有幾何著色器,是在clip-space)。指定這個值並不是必須的。但是不指定可能會導致意想不到的結果。如果你使用轉換反饋或者是關閉了光柵化,或者是使用採用使用者定義輸出產生座標的幾何著色器,則可以忽略指定這個值。
gl_pointsize指定了點的寬度和高度。只有在繪製點的時候指定它的值才是必須的。
gl_clipdistance允許著色器設定乙個頂點到每個剪下平面的距離。正值表示頂點在剪下平面的裡面(後面),而負值表示在剪下平面的外面(前面)。
(3)幾何著色器輸入
ingl_pervertex
gl_in;
ingl_pervertex包含了從前面的頂點著色器傳送過來的值。int
gl_primitiveidin;
gl_primitiveidin是在這次渲染過程中的圖元數量,即先前被gldraw()呼叫所處理的圖元數量。
glsl4.00及其以上版本還有以下定義:
in幾何著色器可以被呼叫多次,這個值指定了當前呼叫。int
gl_invocationid;
(4)幾何著色器輸出
outgl_pervertex
;
outint
gl_primitiveid;
outgl_pervertex和頂點著色器階段有相同的意義。int
gl_layer;
gl_primitiveid是圖元的使用者定義識別符號。它直接被傳送到片斷著色器。如果片斷著色器使用了它的相關輸入但是幾何著色器又沒有指定它的值,那麼它的值就是預定義的(如果沒有幾何著色器opengl會自動生成)。
gl_layer用於渲染到layeredframebuffer objects,指定了特定圖元要被渲染到的layer。
glsl4.10還定義了如下輸出:
out它代表了當前圖元要被採用得視口變換了裁剪測試。使用和gl_layer類似。int
gl_viewportindex;
(5)片斷著色器輸入
invec4
gl_fragcoord;
inbool
gl_frontfacing;
infloat
gl_clipdistance;
invec2
gl_pointcoord;
ingl_fragcoord包含了當前片斷的window-space座標。如果入戶沒過載它,其z分量是要寫入到深度緩衝區的。其w分量是1/wclip(wclip是頂點或幾何著色器的輸出gl_position的w分量)int
gl_primitiveid;
gl_frontfacing:如果圖元從其前面**,則為真,否則為假。
gl_clipdistance包含了頂點著色器的輸出,不過是依據圖元進行線性插值後的。
gl_pointcoord:點內部的位置,指定了片斷的位置。它是被歸一化了的值,位於[0,1]。(0,0)原點位置依賴於opengl的點座標設定,預設是在左下角。
gl_primitiveid是幾何著色器的輸出,如果沒有使用幾何著色器,由opengl產生。代表了被光柵化的圖元索引。
glsl4.00增加了一下輸入:
inint
gl_sampleid;
invec2
gl_sampleposition;
in指定了畫素區域sample的一些屬性。int
gl_samplemaskin;
(6)片斷著色器全域性變數
structgl_depthrangeparameters
;
uniformgl_depthrangeparameters gl_depthrange這個struct提供了對gldepthrange近、遠值的訪問。diff等於far和near的差。;
(7)片斷著色器輸出
out它是要被寫入到深度緩衝區的值。也將被用於深度測試。片斷著色器不一定要指定它的值。它可能被gl_fragcoord.z.自動填充。需要注意的是:如果在某處指定,在其他地方也必須要進行指定。float
gl_fragdepth;
glsl4.00增加了如下輸出:
out當採用多重取樣渲染時,它會被寫入。int
gl_samplemask;
GLSL預定義變數
glsl為不同的渲染階段定義了一些特定的變數。這些預定義 也叫做 內建變數 有特定的屬性。所有的預定義變數都以gl 開頭。使用者定義的變數不能以此開頭。下面分類進行介紹。1 頂點著色器輸入 in int gl vertexid in int gl instanceid gl vertexid是當前被...
OpenGL中使用GLSL著色器
opengl中使用glsl著色器步驟 glsl既適用於頂點著色器,也適用於片段著色器。使用著色器物件的步驟 1 建立著色器物件 gluint glcreateshader glenum type 建立乙個著色器物件,type值必須是gl vertex shader或gl fragment shade...
opengl4 0使用小結
opengl vao vbo fbo 著色器感覺 首先需要兩個庫的支援,視窗庫和opengl顯示卡介面庫,可能表達的不太準確,反正就是那個意思。使用到了glad庫,封裝了不同的硬體顯示卡驅動opengl介面,直接呼叫就可以,glew也可以實現glad的功能。還需要乙個視窗庫,可以使用glfw,或者f...