2013-08-03 206 views
3

您不能使用不受支持的擴展,驅動程序將返回編譯錯誤。但是,你能直接從GLSL代碼檢查一些擴展的可用性嗎?有沒有這樣的事情?GLSL:檢查是否支持擴展

#version XXX core 
#if supported(EXT_some_extension) 
#extension EXT_some_extension: enable 
#endif 

... 

UPDATE:根據尼科爾流星錘答案。是的,出現在我的腦海裏過,但由於某些原因,它不工作

#version 150 core 
#extension ARB_explicit_attrib_location : enable 
#ifdef ARB_explicit_attrib_location 
#define useLayout layout(location = 2) 
#else 
#define useLayout //thats an empty space 
#endif 

in vec2 in_Position; 
useLayout in vec2 in_TextureCoord; 
... 

宏「useLayout」始終設置爲空的空間,但如果我只剩#enable指令無條件將使用它(我的驅動程序支持它)。看起來擴展沒有被定義,它是別的東西(可能?)(#if defined(ARB_explicit_attrib_location)不起作用)

+1

Nicol Bolas是對的。您只是忘記了擴展名定義的GL_'前綴... – derhass

+0

剛剛意識到這一點。謝謝你的幫助。 – TomatoMato

回答

14
#if supported(EXT_some_extension) 
#extension GL_EXT_some_extension: enable 
#endif 

您正在嘗試編寫有條件地使用特定擴展名的着色器。做你想要做什麼正確的方法是這樣的:

有GLSL功能將有它特定的 #define
#extension EXT_some_extension: enable 

#ifdef GL_EXT_some_extension 
//Code that uses the extension. 
#endif //GL_EXT_some_extension 

每OpenGL擴展。如果擴展名不在附近,enable標誌只會發出警告。如果沒有激活,#ifdef不會觸發。

1

GLSL版本直接映射到OpenGL版本。映射爲

OpenGL Version GLSL Version 
      2.0 1.10 
      2.1 1.20 
      3.0 1.30 
      3.1 1.40 
      3.2 1.50 

由於OpenGL-3.3的OpenGL版本與支持的GLSL版本相同,

以類似的方式,GLSL擴展映射到OpenGL擴展,在OpenGL擴展字符串中報告。

鑑於此信息,您可以加載適當的着色器,甚至添加支持條件編譯的處理器定義。

更新glShaderSource需要一個字符串數組,它們在內部連接在一起。這可以用於在實際着色器代碼之前傳遞帶有預處理器定義的字符串。當然,#version …令牌必須在其他所有之前。

+2

版本號碼與檢查「GLSL代碼」的擴展名有什麼關係? –

+0

@NicolBolas:只是一個比喻:以與GLSL「外部」相關的方式來確定支持GLSL的方式,GLSL擴展的可用性取決於OpenGL擴展字符串報告的特定OpenGL擴展的存在。 – datenwolf