OpenGL在可分离着色器程序中改变不同的位置

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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) 将由该位置匹配。没有位置的接口变量将按名称匹配。

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

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

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

【讨论】:

以上是关于OpenGL在可分离着色器程序中改变不同的位置的主要内容,如果未能解决你的问题,请参考以下文章

现代硬件上的 OpenGL 可分离着色器程序和管道性能

OpenGL - 在 NDC 中计算位置适用于着色器,但不适用于“常规”程序

一个主 OpenGL 程序中的多个着色器

OpenGL着色器的显式与自动属性位置绑定

在顶点着色器中更改顶点的颜色

OpenGL 程序着色器链接错误