OpenGL學習隨筆(四)-- 頂點着色器(VertexShader)


頂點着色器對頂點實現了一種通用的可編程方法。
頂點着色器的輸入數據由下面組成:
  • Attributes:使用頂點數組封裝每個頂點的數據,一般用於每個頂點都各不相同的變量,如頂點位置、顏色等。

  • Uniforms:頂點着色器使用的常量數據,不能被着色器修改,一般用於對同一組頂點組成的單個3D物體中所有頂點都相同的變量,如當前光源的位置。

  • Samplers:這個是可選的,一種特殊的uniforms,表示頂點着色器使用的紋理。

  • Shader program:頂點着色器的源碼或可執行文件,描述了將對頂點執行的操作。

頂點着色器的輸出數據是varying(易變)變量,在圖元光柵化階段,這些varying值為每個生成的片元進行計算,並將結果作為片元着色器的輸入數據。從分配給每個頂點的原始varying值來為每個片元生成一個varying值的機制叫做插值。

頂點着色器數據的輸入和輸出可以參考下圖:

頂點着色器可用於傳統的基於頂點的操作,例如:基於矩陣變換位置,進行光照計算來生成每個頂點的顏色,生成或者變換紋理坐標。
另外因為頂點着色器是由應用程序指定的,所以你可以用來進行任意自定義的頂點變換。
下面是一個用OpenGL ES着色器語言編寫的頂點着色器源碼,這個頂點着色器使用一個position和跟它相關聯的color數據作為輸入數據,通過一個4×4矩陣變換位置,然后輸出變換后的位置和顏色數據。
1.  // uniforms used by the vertex shader
2.  uniform mat4 u_mvpMatrix; // matrix to convert P from model
3.  // space to normalized device space.
4.
5.  // attributes input to the vertex shader
6.  attribute vec4 a_position; // position value
7.  attribute vec4 a_color; // input vertex color
8.
9.  // varying variables – input to the fragment shader
10. varying vec4 v_color; // output vertex color
11.
12. void main()
13. {
14. 	v_color = a_color;
15. 	gl_Position = u_mvpMatrix * a_position;
16. }
第2行代碼定義了一個uniform變量u_mvpMatrix,mat4表示4×4浮點數矩陣,該變量存儲了組合模型視圖和投影矩陣。
第6和7行代碼定義了頂點着色器的輸入數據:Attributes,vec4表示包含了4個浮點數的向量,a_position是頂點位置屬性,a_color是頂點顏色屬性。
第10行代碼定義了varying類型的變量v_color,varying是用於從頂點着色器傳遞到片元着色器的變量,v_color是頂點着色器的輸出數據,存儲了每個頂點的顏色。
第12-16行的main函數是頂點着色器和片元着色器的入口。
第14行讀取了頂點着色器輸入屬性中a_color的值,並把它賦值給輸出數據v_color。
第15行的gl_Position 是內置的varying變量,不需要聲明,頂點着色器必須把變換后的位置賦值給它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM