将变量传递给OpenGL GLSL着色器

Chr*_*van 34 iphone opengl-es glsl

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

我已经读过,可以让着色器读取OpenGL状态的一部分(我只需要对此变量进行只读访问),但我不确定该交换是如何发生的.

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

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

Gre*_*g S 62

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

glUseProgram(myShaderProgram);
Run Code Online (Sandbox Code Playgroud)

您可以使用

GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform");
Run Code Online (Sandbox Code Playgroud)

例如

glUniform1f(myUniformLocation, /* some floating point value here */);
Run Code Online (Sandbox Code Playgroud)

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

uniform float myUniform;
Run Code Online (Sandbox Code Playgroud)

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

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

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

还有一些使用制服的教程,你可以通过谷歌搜索"glsl uniform variable"找到它们.

我希望有所帮助.