一、頂點著色器
頂點著色器,根據應用程式的設計,只是選擇處理:
1.視覺空間變換(模型,法線,紋理).
2.主顏色和輔助顏色的計算生成(光照在攝像機座標系中進行實時光照計算).
3.紋理座標計算。
4.霧座標設定和處理。
5.點大小。
1)透視除法。硬體實現。
2)視口對映變換。硬體實現。
3)圖元裝配,在4d裁剪空間中,進行視錐裁剪之前進行。
4)平截頭體(視景體)和使用者裁剪。
5)背面剔除,視口變換後,光柵化之前進行。
6)雙面光照選擇。
7)多邊形模式處理。(可能是指凹凸模式,著色模式,三角帶三角網格模式).
8)多邊形偏移,在圖元裝配階段進行偏移。
9)深度範圍擷取,gldepthrange設定後,固定管線內的實現**進行設定。
頂點著色器,引入的更多實時光照計算,可控制的圖形頂點變換效果(從cpu端移動到gpu端),紋理變換,霧,點大小設定可以有效的控制gpu shader來實現;且其它的opengl狀態設定,例如背面剔除,多次渲染pass狀態等更加方便的統一到shader中進行設定。
二、片斷著色器(畫素著色器)
片段著色器之前,還進行了光柵化插值操作,也是硬體實現的。
片段著色器可以處理的操作是:
1.提取紋理單元,用於紋理貼圖。
2.紋理應用。
3.霧.
4.主顏色和輔助顏色匯合。
不論是否使用片斷著色器,ogl固定管線都要執行下面的操作:
1)單調或平滑著色(控制片斷之間的插值,還需要一層內部過渡處理的)。
2)畫素覆蓋計算。根據圓形畫素點大小,覆蓋到的方形畫素格仔的大小。
3)畫素所有權測試. 畫素位置是不是當前ogl context例項所有,被其它ogl例項視窗遮擋了則不是。
4)裁剪操作。畫素級別還是要進行裁剪的,使用者設定的scissor裁剪。
5)點畫模式應用(實線虛線,ogl 3.0後已經廢除了,ogl3.1刪除了)。
6)scissortest,裁剪測試。
7)alpha測試(ogl 3.1後刪除了,並用片段著色器替代)。
8)模板測試。
9)深度測試,是基於畫素上才能應用深度測試,視口變換後寫入gldepthrange是頂點級別還不能確定)
10)alpha混合,blend操作,當前drawcall得到的顏色和原來在後台顏色快取區中的顏色混合,混合後會在臨時快取會再寫入後台顏色快取,預設寫入時gl_copy。
11)對畫素進行邏輯操作,gllogicop預設是gl_copy.
12)顏色值的抖動,混合周邊的顏色,使得顏色更加豐富些,一般現代硬體都不需要,ogles上還是需要的預設開啟。
13)顏色掩碼操作glcolormask, 模板和深度快取也是有mask的。
來自<
>
lambertian 著色法
l=kdimax(0,n⋅l)
l 是畫素顏色, kd 是散射係數, i 是光照強度,n和l是光源方向和法向量的單位向量。
blinn-phong 著色法
l=kdimax(0,n⋅l)+ksimax(0,n⋅h)p
h是半形向量,ks 是高亮係數,p為phong指數
ambient 著色法
l=kaia+kdimax(0,n⋅l)+ksimax(0,n⋅h)n
ka 是環境係數,ia 是環境光照強度
多點光源
光有乙個非常有用的性質——疊加性,可以得到多點光源下的計算公式:
l=kaia+∑i=1n[kdiimax(0,n⋅li)+ksiimax(0,n⋅hi)p]
來自<
>
OpenGL中使用GLSL著色器
opengl中使用glsl著色器步驟 glsl既適用於頂點著色器,也適用於片段著色器。使用著色器物件的步驟 1 建立著色器物件 gluint glcreateshader glenum type 建立乙個著色器物件,type值必須是gl vertex shader或gl fragment shade...
GLSL著色器周記02
這周學了好多。包括偽隨機數。柏林雜訊。先說偽隨機數。偽隨機數我們用的是週期函式而不是那種由前一項乘乙個超大的數取餘數的方法。使用週期函式的好處就是可以讓其隨時間均勻變化。不過使用週期函式一定要保證週期非常長,不然就會出現重複的圖樣。這是我在網上找到的乙個偽隨機函式 cos x 12.9898 y 4...
GLSL 著色器的輸入輸出變數
int vertexcolorlocation glgetuniformlocation shaderprogram,uniformcolor gluseprogram shaderprogram gluniform4f vertexcolorlocation,0.0f 0.0f 0.0f 1.0f...