【发布时间】:2011-03-14 16:25:56
【问题描述】:
我正在编写一个 iPhone 应用程序,它使用 GLSL 着色器对纹理执行转换,但有一点我有点困难,就是将变量传递给我的 GLSL 着色器。
我读到可以让着色器读取 OpenGL 状态的一部分(我只需要对该变量进行只读访问),但我不确定这种交换会如何发生。
简而言之,我正在尝试获取在片段着色器外部创建的浮点值,以便片段着色器可以访问(无论是传入还是从着色器内部读取)。
感谢您提供的任何帮助/指点,非常感谢!
【问题讨论】:
我正在编写一个 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 或glUniform3fv。
注意:在着色器执行期间不能修改该值,即在 glBegin/glEnd 块中。它是只读的,并且对于处理的每个片段/顶点都是相同的。
还有几个使用制服的教程,你可以通过谷歌搜索“glsl uniform variable”找到它们。
希望对你有帮助。
【讨论】: