? ? ? ? OpenGL ES著色語(yǔ)言是一種高級(jí)的圖形編程語(yǔ)言,它對(duì)變量也有很多可選的限定符,這些限定符大部分只能用來修飾全局變量,下面開始介紹這些限定符。
4種限定符及說明
attribute:一般用于每個(gè)頂點(diǎn)都各不相同的量。如頂點(diǎn)位置,顏色等。
uniform:一般用于對(duì)同一組頂點(diǎn)組成的單個(gè)3D物體中所有頂點(diǎn)都相同的量。如當(dāng)前的光源位置。
varying:用于從頂點(diǎn)著色器傳遞到片元著色器的量。
const:用于聲明常量。
例子:
uniform mat4 uMVPMatrix;
attribute vec3 aPosition;
varying vec4 aaColor;
const int ?lightsCount = 4;
具體介紹
1、uniform變量
????????uniform變量在vertex和fragment兩者之間聲明方式完全一樣,則它可以在vertex和fragment共享使用。(相當(dāng)于一個(gè)被vertex和fragment shader共享的全局變量)。uniform變量是外部application程序傳遞給(vertex和fragment)shader的變量。在(vertex和fragment)shader程序內(nèi)部,uniform變量就像是C語(yǔ)言里面的常量(const ),它不能被shader程序修改。
uniform變量一般用來表示:變換矩陣,材質(zhì),光照參數(shù)和顏色等信息。
以下是例子:
uniform mat4 viewProjMatrix; //視圖+投影矩陣
uniform mat4 viewMatrix; //視圖矩陣
uniform vec3 lightPosition; //光源位置
2.attribute變量
????????attribute變量是只能在vertex shader中使用的變量。(它不能在fragment shader中聲明attribute變量,也不能被fragment shader中使用)。
一般用attribute變量來表示一些頂點(diǎn)的數(shù)據(jù),如:頂點(diǎn)坐標(biāo),法線,紋理坐標(biāo),頂點(diǎn)顏色等。
????????在application中,一般用函數(shù)glBindAttribLocation()來綁定每個(gè)attribute變量的位置,然后用函數(shù)glVertexAttribPointer()為每個(gè)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之間做數(shù)據(jù)傳遞用的。一般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);
}