著色語(yǔ)言基礎(chǔ)


? ? ? ? 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);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容