2010-07-12 94 views
32

我正在写使用GLSL着色器对纹理执行变换一个iPhone应用程序,但我有一点点硬时间被传递变量到我的GLSL着色器的一个点。传递一个变量到OpenGL的GLSL着色器

我读过可能让着色器读取OpenGL状态的一部分(我只需要对此变量进行只读访问),但我不确定这种交换将如何发生。

总之,我试图让一个片段着色器之外创建一个浮动值是片段着色器访问(无论是传入或由着色器读取里面)。

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

回答

56

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

glUseProgram(myShaderProgram); 

可以使用

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

和例如

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

在你的顶点或片段着色器,你需要添加如下声明:

uniform float myUniform; 

就是这样,在你的着色器现在可以访问(只读)的值,你传递早些时候通过glUniform1f

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

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

也有几个教程使用的制服,你可以通过谷歌搜索“GLSL匀变速”找到它们。

我希望有帮助。

+0

格雷格,这工作完美 - 谢谢! – 2010-07-12 16:32:23