2010-07-12 52 views
32

我正在寫使用GLSL着色器對紋理執行變換一個iPhone應用程序,但我有一點點硬時間被傳遞變量到我的GLSL着色器的一個點。傳遞一個變量到OpenGL的GLSL着色器

我讀過可能讓着色器讀取OpenGL狀態的一部分(我只需要對此變量進行只讀訪問),但我不確定這種交換將如何發生。

總之,我試圖讓一個片段着色器之外創建一個浮動值是片段着色器訪問(無論是傳入或由着色器讀取裏面)。

感謝您提供任何幫助/指示,非常感謝!

回答

56

一種選擇是通過統一變量傳遞信息。

glUseProgram(myShaderProgram); 

可以使用

GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform"); 

和例如

glUniform1f(myUniformLocation, /* some floating point value here */); 

在你的頂點或片段着色器,你需要添加如下聲明:

uniform float myUniform; 

就是這樣,在你的着色器現在可以訪問(只讀)的值,你傳遞早些時候通過glUniform1f

當然均勻變量可以包括複雜類型,例如 如數組,結構或矩陣的任何有效GLSL類型。 OpenGL提供了一個glUniform函數,其中適用於每種類型的通常後綴 。例如,要分配到類型爲vec3的變量,可以使用 使用glUniform3fglUniform3fv

注意:在執行着色器期間,即在glBegin/glEnd塊中,該值不能被修改。它是隻讀的,每個處理的片段/頂點都是相同的。

也有幾個教程使用的制服,你可以通過谷歌搜索「GLSL勻變速」找到它們。

我希望有幫助。

+0

格雷格,這工作完美 - 謝謝! – 2010-07-12 16:32:23