将变量传递给OpenGL GLSL着色器

39

我正在编写一个使用GLSL着色器在纹理上执行变换的iPhone应用程序,但我在传递变量给我的GLSL着色器方面遇到了一些困难。

我已经阅读到可以让着色器读取部分OpenGL状态(我只需要只读访问此变量),但是我不确定这种交换该如何进行。

简而言之,我正在尝试获取在片段着色器之外创建的浮点值,并使其能够在片段着色器中访问(无论是通过传递还是从着色器内部读取)。

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

1个回答

76

其中的一种选择是通过uniform变量传递信息。

之后

glUseProgram(myShaderProgram);

你可以使用

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

例如

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

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

uniform float myUniform;

现在你的着色器可以通过 glUniform1f 访问(只读)你之前传递的值。

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

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

还有一些使用 uniforms 的教程,可以通过谷歌“glsl uniform variable”来查找。


我能否为每个顶点传递一个不同的变量? - MichalH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接