上次教程關於光照,此次內容會比較複雜,關於着色器(Shader),GLSL(OpenGL Shading Language)。對於初次接觸圖形學的童鞋,可能比較晦澀。而且用Mac開發的同窗注意,本教程中有關Shader內容,環境均爲win下VS,但這並不表明Mac不支持Shader,只是須要配置一些環境,Google能夠百度一下。數組
頂點屬性(attribute),是隻能在vertex shader中使用的變量,用來表示一些頂點的數據,如:頂點座標,法線,紋理座標,頂點顏色等。app
一致變量(uniform),是外部application程序傳遞給(vertex和fragment)shader的變量,能夠理解爲全局變量,而且是隻讀的屬性,不能經過shader來改變其值。ide
易變變量(out/in),被從一個着色器傳遞至下一個着色器,至關於模塊之間的接口。在咱們上述提到的狀況裏,out變量來自於vertex shader,而後到fragment shader變爲in變量。固然,頂點屬性(attribute)變量能夠當作vertex shader的in變量。學習
常數變量(const),這個就不用多作介紹了吧,和你理解的常量是一個意思。this
瞭解了變量種類,來看看GLSL語言的風格。其實GLSL某種意義上更像是C語言爲圖形學的一種擴展語言。好比也有 int, ivec2, ivec3, ivec4,float, vec2, vec3, vec4 ,bool, bvec2, bvec3, bvec4等類型。vector的元素能夠經過"."來獲取,好比c1.rgba= c2.abgr 。固然也有不同的部分,好比沒有string類型,沒有枚舉enums,固然更沒有指針,而且數組也只能用一維數組。設計
這裏介紹一個GLSL的操做discard,片元丟棄。這是用在片元着色器進行丟棄當前片元的,效果以下:
咱們剛剛提到還有其餘類型的shader,好比細分着色器(Tessellation Shader),幾何着色器(Geometry Shader)等,但咱們的材料只會說起頂點和片元着色器,其餘的不會涉及,以後有時間可能會作一組專門關於shader的教程,那時候會設計這些着色器。咱們看下shaders的流程圖吧:
接下里進入正題,首先從頂點着色器開始。3d
6.3 着色器示例代碼
頂點着色器(Vertex Shader),會進行頂點變換,法線變換,法線歸一化,計算頂點光照,以及獲得頂點的紋理座標並將其傳到片元着色器。指針
內置的Vertex Shader變量主要用到的有:orm
vec4 gl_Vertex
vec3 gl_Normal
vec4 gl_Color
vec4 gl_MultiTexCoord0
mat4 gl_ModelViewMatrix
mat4 gl_ProjectionMatrix
mat4 gl_ModelViewProjectionMatrix
mat4 gl_NormalMatrix (this is the transpose of the inverse of the MV matrix)blog
vec4 gl_Position
片元着色器(Fragment Shader),會進行顏色的計算,紋理映射,處理片元光照操做,還有顏色的融合以及片元丟棄等操做。
內置的Fragment Shader變量主要用到的有:
vec4 gl_FragColor
這樣就能夠寫出一個最簡單的vertex shader和fragment shader:
在vertex shader中有gl_ModelViewProjectionMatrix gl_Vertex這麼一句話,其實能夠分開,寫成gl_ProjectionMatrix gl_ModelViewMatrix gl_Vertex,可是變換每一個頂點時,投影矩陣都將乘上模型視圖矩陣,這顯然很是浪費時間,由於這些矩陣不是隨每一個頂點變化的。因此GLSL提供一些派生的矩陣,也就是說gl_ModelViewProjectionMatrix是上面兩個矩陣的乘積,因此便寫成gl_ModelViewProjectionMatrix gl_Vertex。