shader三種變量類型(uniform,attribute和varying)

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);
}
相關文章
相關標籤/搜索