2013-08-03 150 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