OpenGL ES 2.0——頂點著色器Vertex Shader
在上篇文章中,我們提到了OpenGL ES 2.0中的兩個非常重要的著色器,它們分別是頂點著色器和片元著色器,那麼我們接下來的學習內容就從這兩個著色器開始。在此之前,我們可以先來看一下OpenGL ES 2.0可程式設計管線的每個階段如下圖所示:
上圖中的Vertex Shader和Fragment Shader就是前面所說到的頂點著色器和片段(片元)著色器。
一、頂點著色器的定義:
Vertex Shader頂點著色器,實現了一種通用的可程式設計方法操作頂點。
在程式設計中,頂點著色器的輸入主要有:
1.Attributes——屬性,頂點矩陣支援的Per_vertex資料
2.Uniforms——頂點著色器使用的常量資料
3.Samplers——被Uniforms使用的特殊型別,在頂點著色器的貼圖中使用(是可選的)
4.ShaderProgram——頂點著色器程式設計原始碼或可執行的部分
對應的,頂點著色器的輸出叫做varying變數:
在最初的光柵化階段,這些變數被計算,作為片段著色器的輸入,從頂點著色器的矩陣使用插補的方法產生片段著色器的變數,輸入和輸出如下圖所示:
二、頂點著色器的作用:
頂點著色器被使用在傳統的基於頂點的操作,例如位移矩陣、計算光照方程、產生貼圖座標。頂點著色器被應用指定,應用於客戶的頂點轉化。
假設我們此時要編寫一個頂點著色器,需要有一個位置和顏色資料這兩個輸入屬性,其中輸入位置資料時4X4的矩陣,輸出是變換後的位置和顏色:
uniform mat4 u_mvpMatrix; // matrix to convert a_position // from model space to normalized // device space // attributes input to the vertex shader in vec4 a_position; // position value in vec4 a_color; // input vertex color // output of the vertex shader - input to fragment // shader out vec4 v_color; // output vertex color void main() { v_color = a_color; gl_Position = u_mvpMatrix * a_position; }
上述程式中,首先定義了一個uniform變數u_mvpMatrix,此變數用於儲存模型的關聯檢視和投射矩陣(也就是輸入和輸出的位置轉換關係),然後聲明瞭a_position和a_color這兩個表示頂點著色器的兩個輸入屬性(位置和顏色),而gl_Position和v_color則表示輸出的兩個屬性,其中gl_Position無需宣告,因為它是OpenGL的內部屬性。
三、基元裝配和光柵化:
基元(圖元):是能被OpenGL ES繪製的幾何物體,這些繪圖命令描述了一個頂點屬性和基元幾何體以及基元型別的集合。圖元是由頂點組成的,頂點屬性包括計算位置、顏色和貼圖座標的資訊,他們將被輸入到片段著色器中。
頂點著色器能繪製的幾何圖元包括三角形、直線、點,對每個圖元必須判斷是否位於投影平截體內,如果圖元不完全在平截體內部,將被檢視平截體剪貼,如果完全在平截體外,將被丟棄,然後頂點位置被轉變為螢幕座標,剔除操作也能夠捨棄一些圖元,依據圖元位於正面還是背面,剪下和剔除後,圖元進入光柵化階段。
光柵化:是轉化圖元為二維片段的過程,被片段著色器執行,二維的片段畫素能夠被繪製在螢幕上。