Shader著色器基礎 OpenGL程式設計筆記2

2021-08-03 04:07:42 字數 1577 閱讀 4201

頂點著色器(vertex shader)

每個頂點都要執行一次vertex shader。 它的功能就是把每個頂點在虛擬空間中的三維座標變換為可以在 螢幕上顯示的二維座標,並帶有用於z-buffer的深度資訊。

可操作屬性:位置、顏色、紋理座標,但是不能建立新的頂點。

主要完成以下工作:

attribute可以理解為針對每乙個頂點的輸入資料,如空間位置,法向量,紋理座標以及頂點顏色。

它只在頂點著色器中才有,片段著色器中沒有屬性

uniform

uniform儲存由應用程式傳遞給著色器的唯讀常量資料

在頂點著色器中,這些資料通常是變換矩陣,光照引數,顏色等。

由 uniform 修飾符修飾的變數屬於全域性變數,該全域性性對頂點著色器與片段著色器均可見

若這兩個著色器如果被連線到同一 個program object,則它們共享同乙份 uniform 全域性變數集

因此如果在這兩個著色器中都宣告了同名的 uniform 變數,要保證這對同名變數完全相同:同名+同型別,因為它們實際是同乙個變數

此外,uniform 變數儲存在常量儲存區

sampler

一種特殊的 uniform,在vertex shader中是可選的,用於呈現紋理。sampler 可用於頂點著色器和片段著色器。

頂點著色器輸出

varying

varying 變數用於儲存頂點著色器的輸出資料,當然也儲存片元著色器的輸入資料,varying 變數最終會在光柵化處理階段被線性插值。

頂點著色器如果宣告了 varying 變數,它必須被傳遞到片元著色器中才能進一步傳遞到下一階段,因此頂點著色器中宣告的 varying 變數都應在片元著色器中重新宣告同名同型別的 varying 變數。

內建變數

如:gl_position, gl_frontfacing, gl_pointsize

片段著色器(fragment shader)

它計算每個畫素的顏色和其它屬性。它通過應用光照值、凹凸貼圖,陰影,鏡面高光,半透明等處理來計算畫素的顏色並輸出。它也可改變畫素的深度(z-buffering)或在多個渲染目標被啟用的狀態下輸出多種顏色。乙個pixel shader不能產生複雜的效果,因為它只在乙個畫素上進行操作,而不知道場景的幾何形狀。

片段著色器的輸入資料

頂點著色器階段輸出的 varying 變數在光柵化階段被線性插值計算之後輸出到片元著色器中作為它的輸入,包含上述中的 gl_fragcoord,gl_frontfacing 和 gl_pointcoord。

uniform

前面也已經講過,這裡是用於片元著色器的常量,如霧化引數,紋理引數等

sampler

一種特殊的 uniform,用於呈現紋理

在片段著色器階段只有唯一的 varying 輸出變數-即內建變數:gl_fragcolor

著色器(Shader)之畫素著色器

畫素著色器實際上就是對每乙個畫素進行光柵化的處理期間,在gpu上運算的一段程式。不同與頂點著色器,畫素著色器不會以軟體的形式來模擬畫素著色器。畫素著色器實質上是取代了固定功能流水線中多重紋理的環節,而且賦予了我們訪問單個畫素以及訪問每乙個畫素紋理座標的能力 多重紋理就是我們同時啟用多層紋理,然後規定...

著色器(Shader)之頂點著色器

頂點著色器其實就是我們自己編寫的一段在gpu中執行的程式,有了頂點著色器,我們就可以從固定的功能流水線中代替一些模組,從而獲得更多的頂點操作的靈活性。對於頂點位置進行操作的的能力具有廣泛的應該場合 織物模擬 粒子系統的點尺寸處理等。可程式設計流水線中的頂點結構比固定的流水線具有更加豐富的資料。首先我...

著色器基礎

glsl基本型別 float 32位 double 64位 int 有符號二進位制補碼的32位整數 uint 無符號的32位整數 bool 布林值 儲存限制符 const 必須在宣告時就初始化,唯讀型別,編譯時常量 in 著色器階段的輸入變數 out 輸出變數 uniform 必須定義為全域性變數,...