【发布时间】:2013-09-28 06:27:18
【问题描述】:
我正在尝试在 OS X 上创建一个简单的 OpenGL 3.2 核心配置文件应用程序。我正在通过 Macports 使用 SDL2,但我怀疑这是否重要。我的理解是我应该使用 GLSL #version 150,而我的琐碎片段着色器目前看起来像这样:
#version 150
out vec4 outputF;
void main() {
outputF = vec4(1.0, 0.0, 0.0, 1.0);
}
现在我认为我需要通过glBindFragDataLocation 函数告诉OpenGL 片段颜色正在outputF 中设置。问题是它似乎没有在任何地方声明。 3.2核心配置文件中没有此功能(与我的搜索相反),还是我缺少头文件,还是什么?
【问题讨论】:
-
由于您已将 GLSL 1.5 作为此着色器的基线,您可以完全跳过使用
glBindFragDataLocation (...)并使用layout (location = 0) out vec4 outputF;。请注意,片段着色器中第一个使用的out变量从一开始就绑定到颜色缓冲区 0,因此在大多数只写入单个颜色缓冲区的应用程序中,您不需要弄乱第一名。设置绑定位置是一种很好的形式,但绝对不是必须的。 -
@AndonM.Coleman 谢谢,但是在指定您建议的布局规范时,我得到一个着色器编译器错误,它只是读取
Invalid use of layout 'location'。 -
@AndonM.Coleman,GLSL 1.50 不支持布局限定符。在
#version声明工作之后,在我的机器上#extension GL_ARB_explicit_attrib_location : enable;而#version 330似乎在某种程度上也有效 - 供应商驱动程序? GL 3.2 都不能依赖它们。 -
@BrettHale:是的,你是对的。我总是忘记 GLSL 330 是这个限定词被提升为核心的时候;可能是因为尽管 OS X 10.7/8 是 OpenGL 3.2 (GLSL 150),但它实际上确实全面支持此功能。不过,它确实需要您提到的
#extension编译器指令。 -
@ArcaneEngineer:这是一个有效的观点,尽管我使用的材质系统会输出动态着色器,并且它对于处理生成的文本输出中的整个过程也很有用。这就是这两个选项都可用的原因。虽然我最初的观点是
outputF被自动分配了一个绑定位置,但这并不是你应该依赖的行为,因为它没有很好地定义(例如,一些实现按字母顺序分配位置,其他实现按使用顺序分配)。最好在 MRT 应用程序中明确说明这些位置。
标签: macos opengl glsl opengl-3