37

我正在编写一个 iPhone 应用程序,它使用 GLSL 着色器对纹理执行转换,但我遇到的一点困难是将变量传递给我的 GLSL 着色器。

我已经读到可以让着色器读取 OpenGL 状态的一部分(我只需要对该变量的只读访问权限),但我不确定这种交换将如何发生。

简而言之,我试图获取在片段着色器之外创建的浮点值,以便片段着色器可以访问(无论它是传入还是从着色器内部读取)。

感谢您提供的任何帮助/指示,非常感谢!

4

1 回答 1

73

一种选择是通过统一变量传递信息。

glUseProgram(myShaderProgram);

您可以使用

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

例如

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

在您的顶点或片段着色器中,您需要添加以下声明:

uniform float myUniform;

就是这样,在您的着色器中,您现在可以访问(只读)您之前通过的值glUniform1f

当然,统一变量可以是任何有效的 GLSL 类型,包括复杂类型,例如数组、结构或矩阵。OpenGL 提供了一个glUniform带有常用后缀的函数,适用于每种类型。例如,要分配给类型为 的变量vec3,可以使用glUniform3for glUniform3fv

注意:在着色器执行期间不能修改该值,即在glBegin/glEnd块中。它是只读的,并且对于处理的每个片段/顶点都是相同的。

还有几个使用制服的教程,你可以通过谷歌搜索“glsl uniform variable”找到它们。

我希望这会有所帮助。

于 2010-07-12T07:59:37.490 回答