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)
语法,用于在着色器本身中指定顶点着色器输入和片段着色器输出的位置,之前分别使用glBindAttribLocation
和glBindFragDataLocation
完成. ARB_separate_shader_objects
将此扩展到所有输入/输出。
我没有看到用于设置位置的 C 函数(glBindAttribLocation
和 glBindFragDataLocation
除外),因此您必须使用布局限定符。确保您设置了适当的 GLSL 版本/扩展名,并且您使用的是 in
/out
关键字而不是 attribute
/varying
。
【讨论】:
谢谢,我正在使用 GLSL 420,所以不用担心。我会很好:我不想重写我所有的着色器。【参考方案2】:对于可分离的程序(也就是管道),变量是按位置而不是名称来匹配的。
这不是真的。
接口变量(你称之为“变量”)may or may not be matched based on location in separate programs。
单独程序中的接口变量具有在 GLSL 中指定的 layout(location)
将由该位置匹配。没有位置的接口变量将按名称匹配。
主要区别在于不匹配时会发生什么。如果名称在另一侧没有匹配项,则会导致未定义的行为。但这会导致 所有 命名接口变量的行为未定义,而不仅仅是不匹配的变量。
但是,如果位置在另一侧不匹配,则位置输入具有未定义的值,或者位置输出被丢弃。
因此,如果您愿意,可以将命名匹配与单独的程序一起使用。您只需要确保匹配准确。基于位置的匹配用于非精确匹配。
【讨论】:
以上是关于OpenGL在可分离着色器程序中改变不同的位置的主要内容,如果未能解决你的问题,请参考以下文章