2013-09-28 30 views
1

我想在OS X上创建一个简单的OpenGL 3.2核心配置文件应用程序。我通过Macports使用SDL2,但我怀疑这一点。我的理解是,我应该使用GLSL #version 150和我的琐碎片段着色器目前看起来是这样的:OS X OpenGL 3.2不包含glBindFragDataLocation?

#version 150 

out vec4 outputF; 

void main() { 
    outputF = vec4(1.0, 0.0, 0.0, 1.0); 
} 

现在我相信我要告诉OpenGL该片段颜色在outputF通过glBindFragDataLocation功能设定。问题在于它似乎没有在任何地方宣布。该功能在3.2核心配置文件中不可用(与我的搜索相反),还是缺少头文件?或者是什么?

+0

既然你已经建立了GLSL 1.5为基准此着色器,你可以跳过不必完全使用'glBindFragDataLocation(...)'并使用'layout(location = 0)out vec4 outputF;'。请注意,片段着色器中第一个使用的'out'变量绑定到颜色缓冲区0开始,所以在大多数只写入单个颜色缓冲区的应用程序中,您不需要混淆第一名。设置装订位置是一种很好的形式,但绝对不是必需的。 –

+0

@ AndonM.Coleman谢谢,但是当指定布局规范时,您会发现着色器编译器错误,您只是简单地读取'布局'位置'的无效使用'。 – Karl

+2

@ AndonM.Coleman,GLSL 1.50不支持布局限定符。在'#version'声明工作后,在我的机器上'#extension GL_ARB_explicit_attrib_location:enable';而'#version 330'似乎也在某种程度上起作用 - 卖主驱动程序? GL 3.2也不能依赖。 –

回答

4

如果您使用的是OS X,则需要包含GL 3.2(核心)配置文件的<OpenGL/gl3.h>标头。由于OpenGL的框架的一部分,它是在被发现:

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

如果你正在写的片段为默认的帧缓冲,则不需要此调用。也就是说,默认情况下,outputF将被绑定到'颜色编号'(0)。 IIRC,只要它不以保留的gl_前缀开头,你可以将这个变量称为out变量。

我没有用过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 
+0

我唯一要讨论的是如何调用'out'变量的方法是GLSL中的片段着色器输出不能:1.双精度浮点(未扩展的GLSL 1.5没有双精度的概念,所以这并不重要),2.矩阵,3.结构。 –

+0

此外,从我记得Apple的移植文档中,他们建议'__APPLE_CC__'只用于区分编译器版本,'__APPLE__'用于任何平台特定的代码。在大多数情况下它可能没有什么区别,但是其中一个('__APPLE__')仅仅是一个布尔值,另一个具有数字含义('__APPLE_CC__')。当交叉编译OS X的某些东西或者使用除了定义了'__APPLE__'的Xcode的gcc/clang东西以外的编译器而不是'__APPLE_CC__'的编译器时(例如使用Intel C++时),也许可以。 –

+0

谢谢。对于为什么'glBindFragDataLocation'不可用,我仍然有点困惑,但我只是继续我的生活,因为我不需要它。 – Karl