2013-09-28 72 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