https://blog.csdn.net/linshuhe1/article/details/51075783
在上篇文章中,我們提到了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繪制的幾何物體,這些繪圖命令描述了一個頂點屬性和基元幾何體以及基元類型的集合。圖元是由頂點組成的,頂點屬性包括計算位置、顏色和貼圖坐標的信息,他們將被輸入到片段着色器中。
頂點着色器能繪制的幾何圖元包括三角形、直線、點,對每個圖元必須判斷是否位於投影平截體內,如果圖元不完全在平截體內部,將被視圖平截體剪貼,如果完全在平截體外,將被丟棄,然后頂點位置被轉變為屏幕坐標,剔除操作也能夠舍棄一些圖元,依據圖元位於正面還是背面,剪切和剔除后,圖元進入光柵化階段。
光柵化:是轉化圖元為二維片段的過程,被片段着色器執行,二維的片段像素能夠被繪制在屏幕上。

