我正在编写一个使用GLSL着色器在纹理上执行变换的iPhone应用程序,但我在传递变量给我的GLSL着色器方面遇到了一些困难。
我已经阅读到可以让着色器读取部分OpenGL状态(我只需要只读访问此变量),但是我不确定这种交换该如何进行。
简而言之,我正在尝试获取在片段着色器之外创建的浮点值,并使其能够在片段着色器中访问(无论是通过传递还是从着色器内部读取)。
非常感谢您提供的任何帮助/指导!
其中的一种选择是通过uniform变量传递信息。
之后
glUseProgram(myShaderProgram);
你可以使用
GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform");
例如
glUniform1f(myUniformLocation, /* some floating point value here */);
在你的顶点或片元着色器中,你需要添加以下声明:
uniform float myUniform;
现在你的着色器可以通过 glUniform1f
访问(只读)你之前传递的值。
当然,uniform 变量可以是任何有效的 GLSL 类型,包括复杂类型,如数组、结构或矩阵。OpenGL 提供了一个带有通常后缀的 glUniform
函数,适用于每种类型。例如,要分配给类型为 vec3
的变量,可以使用 glUniform3f
或 glUniform3fv
。
注意:在着色器的执行期间,即在 glBegin
/glEnd
块中,不能修改该值。它是只读的,并且对于处理的每个片段/顶点都相同。
还有一些使用 uniforms 的教程,可以通过谷歌“glsl uniform variable”来查找。