Uniform
uniform是一個(gè)關(guān)鍵字,用于在著色器中聲明全局變量。這意味著它必須在每個(gè)著色器程序?qū)ο笾卸际仟?dú)一無(wú)二的。uniform變量可以從CPU端傳遞給GPU端,并在渲染過(guò)程中保持不變,即在一次繪制調(diào)用期間,uniform變量的值是不會(huì)改變的。
使用一個(gè)uniform變量通常需要以下步驟:
I.在著色器程序中使用uniform關(guān)鍵字來(lái)聲明變量。
II.在應(yīng)用程序中獲取uniform變量的位置。
III.為uniform變量設(shè)置一個(gè)值,這樣它就會(huì)在渲染時(shí)保持該值。
下面讓我們?cè)囍ㄟ^(guò)uniform來(lái)為圖形設(shè)置顏色。

我們?cè)谄沃髦新暶髁艘粋€(gè)uniform的vec4類(lèi)型的全局變量u_color,并把片段著色器的輸出顏色設(shè)置為uniform值的內(nèi)容。
uniform變量的值是通過(guò)函數(shù)glUniform*()來(lái)設(shè)置的。glUniform*()是一系列函數(shù)。由于u_color是vec4,這里我們使用glUniform4f(),表示函數(shù)需要4個(gè)float類(lèi)型的值來(lái)設(shè)定uniform變量。

第一個(gè)參數(shù)是uniform變量的位置。我們需要使用函數(shù)glGetUniformLocation()來(lái)查詢(xún)我們創(chuàng)建的uniform變量的位置。

第一個(gè)參數(shù)是我們創(chuàng)建的著色器程序,第二個(gè)參數(shù)是uniform變量的名字。如果函數(shù)返回-1表示沒(méi)有找到這個(gè)位置值。
下面是使用示例:

注意:在使用uniform之前必須先調(diào)用glUseProgram()。因?yàn)樗窃诋?dāng)前激活的著色器程序中設(shè)置uniform的。
使用uniform的好處是我們可以在隨時(shí)更新變量的值。譬如我們可以把顏色中的紅色通道設(shè)置成一個(gè)隨時(shí)間變化的變量,這樣每次渲染時(shí)顏色都會(huì)發(fā)生改變。