著色器語言
-
在Android上Opengl是通過Vertex Shader 和 Fragment Shader 這兩種定點著色器程序來實現(xiàn)圖片的加載和渲染的。中文稱為頂點著色器和片段著色器。在Android平臺上Shader程序一般以字符串的形式出現(xiàn),或者在res/raw/目錄下以*.glsl的格式出現(xiàn)。
VERTEX_SHADER
-
頂點著色器
為每一個頂點生成坐標,因此每個頂點都要運行一遍頂點著色器程序,一旦頂點坐標計算出來之后,OpenGL就能夠使用這些頂點來組成點鄙信,線,和三角形忿晕。所有任意的圖形都是由這三種基本元素來描述的装诡。
-
定義類型變量
-
atrribute
只能在vertex shader中使用的變量,用attribute變量來表示一些頂點的數(shù)據(jù)杏糙,包含了頂點坐標慎王,法線,紋理坐標宏侍,頂點顏色等赖淤。應用中一般用函數(shù)glBindAttribLocation()來綁定每個attribute變量的位置,然后用函數(shù)glVertexAttribPointer()為每個attribute變量賦值谅河。
-
varying
被稱為易變量咱旱,用于從Vertex Shader 向 Fragment Shader傳遞數(shù)據(jù),上面例子中在VertexShader中定義了attribute 類型的二維向量a_texcoord绷耍,并將該值賦值給varying類型的二維向量 v_texcoord吐限。
-
-
在main() 中必須將頂點坐標賦值給系統(tǒng)變量gl_Position
-
頂點著色器示例
attribute vec4 a_position; attribute vec2 a_texcoord; varying vec2 v_texcoord; void main() { gl_Position = a_position v_texcoord = a_texcoord; }
FRAGMENT_SHADER
-
片段著色器
為點、線或者三角形的每一個頂點的片段(Fragment)生成渲染后的最終顏色褂始。片段就是一個小的單色矩形區(qū)域诸典,可以簡單的認為是屏幕上的一個像素點。
-
定義類型變量
-
uniform
是APP序傳遞給(vertex和fragment)shader的變量崎苗。通過函數(shù)glUniform**()函數(shù)賦值的狐粱。shader程序只能用不能修改。如果uniform變量在vertex和fragment兩者之間聲明方式完全一樣胆数,則它可以在vertex和fragment共享使用肌蜻。uniform變量一般用來表示:變換矩陣,材質必尼,光照參數(shù)和顏色等信息蒋搜。 -
varying
-
precision mediump float
用于定義數(shù)據(jù)精度,Opengl中可以設置三種類型的精度(lowp,medium 和 highp)判莉,對于Vertex Shader來說豆挽,Opengl使用的是默認最高精度級別(highp),因此沒有定義
-
-
在main() 中必須對gl_FragColor賦值
-
片段著色器示例
precision mediump float; uniform sampler2D tex_sampler; varying vec2 v_texcoord; void main() { gl_FragColor = texture2D(tex_sampler, v_texcoord); }