我正在寫使用GLSL着色器對紋理執行變換一個iPhone應用程序,但我有一點點硬時間被傳遞變量到我的GLSL着色器的一個點。傳遞一個變量到OpenGL的GLSL着色器
我讀過可能讓着色器讀取OpenGL狀態的一部分(我只需要對此變量進行只讀訪問),但我不確定這種交換將如何發生。
總之,我試圖讓一個片段着色器之外創建一個浮動值是片段着色器訪問(無論是傳入或由着色器讀取裏面)。
感謝您提供任何幫助/指示,非常感謝!
我正在寫使用GLSL着色器對紋理執行變換一個iPhone應用程序,但我有一點點硬時間被傳遞變量到我的GLSL着色器的一個點。傳遞一個變量到OpenGL的GLSL着色器
我讀過可能讓着色器讀取OpenGL狀態的一部分(我只需要對此變量進行只讀訪問),但我不確定這種交換將如何發生。
總之,我試圖讓一個片段着色器之外創建一個浮動值是片段着色器訪問(無論是傳入或由着色器讀取裏面)。
感謝您提供任何幫助/指示,非常感謝!
一種選擇是通過統一變量傳遞信息。
後
glUseProgram(myShaderProgram);
可以使用
GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform");
和例如
glUniform1f(myUniformLocation, /* some floating point value here */);
在你的頂點或片段着色器,你需要添加如下聲明:
uniform float myUniform;
就是這樣,在你的着色器現在可以訪問(只讀)的值,你傳遞早些時候通過glUniform1f
。
當然均勻變量可以包括複雜類型,例如 如數組,結構或矩陣的任何有效GLSL類型。 OpenGL提供了一個glUniform
函數,其中適用於每種類型的通常後綴 。例如,要分配到類型爲vec3
的變量,可以使用 使用glUniform3f
或glUniform3fv
。
注意:在執行着色器期間,即在glBegin
/glEnd
塊中,該值不能被修改。它是隻讀的,每個處理的片段/頂點都是相同的。
也有幾個教程使用的制服,你可以通過谷歌搜索「GLSL勻變速」找到它們。
我希望有幫助。
格雷格,這工作完美 - 謝謝! – 2010-07-12 16:32:23