標籤:
uniform變數在vertex和fragment兩者之間聲明方式完全一樣,則它可以在vertex和fragment共用使用。(相當於一個被vertex和fragment shader共用的全域變數) uniform變數一般用來表示:變換矩陣,材質,光照參數和顏色等資訊。 以下是例子: uniform mat4 viewProjMatrix; //投影+視圖矩陣 uniform mat4 viewMatrix; //視圖矩陣 uniform vec3 lightPosition; //光源位置 2.attribute變數 attribute變數是只能在vertex shader中使用的變數。(它不能在fragment shader中聲明attribute變數,也不能被fragment shader中使用) 一般用attribute變數來表示一些頂點的資料,如:頂點座標,法線,紋理座標,頂點顏色等。 在application中,一般用函數glBindAttribLocation()來綁定每個attribute變數的位置,然後用函數glVertexAttribPointer()為每個attribute變數賦值。 以下是例子: uniform mat4 u_matViewProjection; attribute vec4 a_position; attribute vec2 a_texCoord0; varying vec2 v_texCoord; void main(void) { gl_Position = u_matViewProjection * a_position; v_texCoord = a_texCoord0; } 3.varying變數 varying變數是vertex和fragment shader之間做資料傳遞用的。一般vertex shader修改varying變數的值,然後fragment shader使用該varying變數的值。因此varying變數在vertex和fragment shader二者之間的聲明必須是一致的。application不能使用此變數。 以下是例子: // Vertex shader uniform mat4 u_matViewProjection; attribute vec4 a_position; attribute vec2 a_texCoord0; varying vec2 v_texCoord; // Varying in vertex shader void main(void) { gl_Position = u_matViewProjection * a_position; v_texCoord = a_texCoord0; } // Fragment shader precision mediump float; varying vec2 v_texCoord; // Varying in fragment shader uniform sampler2D s_baseMap; uniform sampler2D s_lightMap; void main() { vec4 baseColor; vec4 lightColor; baseColor = texture2D(s_baseMap, v_texCoord); lightColor = texture2D(s_lightMap, v_texCoord); gl_FragColor = baseColor * (lightColor + 0.25); }
shader三種變數類型(uniform,attribute和varying)