【发布时间】:2015-09-28 14:10:12
【问题描述】:
我正在尝试将着色器与 OpenGL 的着色器程序管道混合/匹配。 对于可分离的程序(因此,管道),变化是通过位置而不是名称来匹配的。 “干净”的解决方案是从 C 代码中设置位置,但无论如何我都找不到。 glGetProgramResource... 允许获取程序输出位置,但我没有找到如何设置它们。有没有办法在核心中做到这一点?如果不是,为什么不可能?
【问题讨论】:
我正在尝试将着色器与 OpenGL 的着色器程序管道混合/匹配。 对于可分离的程序(因此,管道),变化是通过位置而不是名称来匹配的。 “干净”的解决方案是从 C 代码中设置位置,但无论如何我都找不到。 glGetProgramResource... 允许获取程序输出位置,但我没有找到如何设置它们。有没有办法在核心中做到这一点?如果不是,为什么不可能?
【问题讨论】:
(注意:我实际上并没有使用可分离着色器;这是基于我对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。
【讨论】:
对于可分离的程序(也就是管道),变量是按位置而不是名称来匹配的。
这不是真的。
接口变量(你称之为“变量”)may or may not be matched based on location in separate programs。
单独程序中的接口变量具有在 GLSL 中指定的 layout(location) 将由该位置匹配。没有位置的接口变量将按名称匹配。
主要区别在于不匹配时会发生什么。如果名称在另一侧没有匹配项,则会导致未定义的行为。但这会导致 所有 命名接口变量的行为未定义,而不仅仅是不匹配的变量。
但是,如果位置在另一侧不匹配,则位置输入具有未定义的值,或者位置输出被丢弃。
因此,如果您愿意,可以将命名匹配与单独的程序一起使用。您只需要确保匹配准确。基于位置的匹配用于非精确匹配。
【讨论】: