我正在编写一个 iPhone 应用程序,它使用 GLSL 着色器对纹理执行转换,但我遇到的一点困难是将变量传递给我的 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
or glUniform3fv
。
注意:在着色器执行期间不能修改该值,即在glBegin
/glEnd
块中。它是只读的,并且对于处理的每个片段/顶点都是相同的。
还有几个使用制服的教程,你可以通过谷歌搜索“glsl uniform variable”找到它们。
我希望这会有所帮助。