【问题标题】:OpenGL change varying location in separable shader programOpenGL在可分离着色器程序中改变不同的位置
【发布时间】:2015-09-28 14:10:12
【问题描述】:

我正在尝试将着色器与 OpenGL 的着色器程序管道混合/匹配。 对于可分离的程序(因此,管道),变化是通过位置而不是名称来匹配的。 “干净”的解决方案是从 C 代码中设置位置,但无论如何我都找不到。 glGetProgramResource... 允许获取程序输出位置,但我没有找到如何设置它们。有没有办法在核心中做到这一点?如果不是,为什么不可能?

【问题讨论】:

    标签: c++ c opengl glsl shader


    【解决方案1】:

    (注意:我实际上并没有使用可分离着色器;这是基于我对the ARB_separate_shader_objects spec 的阅读。)

    ARB_separate_shader_objects 需要ARB_explicit_attrib_location 扩展,它添加了layout(location=N) 语法,用于在着色器本身中指定顶点着色器输入和片段着色器输出的位置,之前分别使用glBindAttribLocationglBindFragDataLocation 完成. ARB_separate_shader_objects 将此扩展到所有输入/输出。

    我没有看到用于设置位置的 C 函数(glBindAttribLocationglBindFragDataLocation 除外),因此您必须使用布局限定符。确保您设置了适当的 GLSL 版本/扩展名,并且您使用的是 in/out 关键字而不是 attribute/varying

    【讨论】:

    • 谢谢,我正在使用 GLSL 420,所以不用担心。我会很好:我不想重写我所有的着色器。
    【解决方案2】:

    对于可分离的程序(也就是管道),变量是按位置而不是名称来匹配的。

    这不是真的。

    接口变量(你称之为“变量”)may or may not be matched based on location in separate programs

    单独程序中的接口变量具有在 GLSL 中指定的 layout(location) 将由该位置匹配。没有位置的接口变量将按名称匹配。

    主要区别在于不匹配时会发生什么。如果名称在另一侧没有匹配项,则会导致未定义的行为。但这会导致 所有 命名接口变量的行为未定义,而不仅仅是不匹配的变量。

    但是,如果位置在另一侧不匹配,则位置输入具有未定义的值,或者位置输出被丢弃。

    因此,如果您愿意,可以将命名匹配与单独的程序一起使用。您只需要确保匹配准确。基于位置的匹配用于非精确匹配。

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多