【问题标题】:OS X OpenGL 3.2 doesn't include glBindFragDataLocation?OS X OpenGL 3.2 不包括 glBindFragDataLocation?
【发布时间】: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


【解决方案1】:

如果您使用的是 OS X,则需要为 GL 3.2(核心)配置文件添加 <OpenGL/gl3.h> 标头。作为 OpenGL 框架的一部分,它位于:

/System/Library/Frameworks/OpenGL.framework/Headers/gl3.h

如果您将片段写入默认帧缓冲区,则不需要此调用。也就是说,outputF 默认会绑定到“颜色编号”(0)。 IIRC,您可以随意调用此 out 变量,只要它不以保留的 gl_ 前缀开头。

我还没有尝试过 SDL2 - 但您可能想先添加 #define GL3_PROTOTYPES,例如,

#define GL3_PROTOTYPES

#if defined (__APPLE_CC__)
#include <OpenGL/gl3.h>
#else
#include <GL/glcorearb.h> // assert GL 3.2 core profile available...
#endif

【讨论】:

  • 在讨论如何/如何调用out 变量时,我唯一要补充的是 GLSL 中的片段着色器输出不能是:1. 双精度浮点(未扩展的 GLSL 1.5没有双精度的概念,所以这无关紧要),2. 矩阵,3. 结构。
  • 另外,根据我对 Apple 移植文档的回忆,他们建议 __APPLE_CC__ 仅用于区分编译器版本,__APPLE__ 用于任何特定于平台的代码。在大多数情况下它可能没有区别,但一个 (__APPLE__) 只是一个布尔值,而另一个具有数字含义 (__APPLE_CC__)。当为 OS X 交叉编译某些东西或使用 Xcode 附带的 gcc/clang 东西以外的编译器时,可能有可能定义 __APPLE__ 但未定义 __APPLE_CC__(例如在使用 Intel C++ 时)。跨度>
  • 谢谢。我仍然有点困惑为什么glBindFragDataLocation 不可用,但我会继续我的生活,因为我不需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多