我正在写使用GLSL着色器对纹理执行变换一个iPhone应用程序,但我有一点点硬时间被传递变量到我的GLSL着色器的一个点。传递一个变量到OpenGL的GLSL着色器
我读过可能让着色器读取OpenGL状态的一部分(我只需要对此变量进行只读访问),但我不确定这种交换将如何发生。
总之,我试图让一个片段着色器之外创建一个浮动值是片段着色器访问(无论是传入或由着色器读取里面)。
感谢您提供任何帮助/指示,非常感谢!
我正在写使用GLSL着色器对纹理执行变换一个iPhone应用程序,但我有一点点硬时间被传递变量到我的GLSL着色器的一个点。传递一个变量到OpenGL的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匀变速”找到它们。
我希望有帮助。
格雷格,这工作完美 - 谢谢! – 2010-07-12 16:32:23