【问题标题】:Passing a variable to an OpenGL GLSL shader将变量传递给 OpenGL GLSL 着色器
【发布时间】:2011-03-14 16:25:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: iphone opengl-es glsl


    【解决方案1】:

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

    之后

    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 uniform variable”找到它们。

    希望对你有帮助。

    【讨论】:

    • 我也可以传递每个顶点不同的变量吗?
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多