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

1.uniform變量

uniform變量是外部application程序傳遞給(vertex和fragment)shader的變量。因此它是application通過函數glUniform**()函數賦值的。在(vertex和fragment)shader程序內部,uniform變量就像是C語言裏面的常量(const ),它不能被shader程序修改。(shader只能用,不能改)

如果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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章