GLSL:检查扩展是否受支持

7

如果使用不支持的扩展,驱动程序将返回编译错误。但是您能否直接从GLSL代码检查某些扩展的可用性?是否有类似的东西?

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

...

更新:根据Nicol的Bolas的回答。是的,这也出现在我的脑海中,但由于某些原因,它并没有起作用。

#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)也不起作用)


2
Nicol Bolas 是正确的。您只是忘记了扩展定义的 GL_ 前缀... - derhass
刚刚意识到了。感谢您的帮助。 - TomatoMato
2个回答

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

您正在尝试编写一个着色器,它有条件地使用某个扩展。正确的方法是这样的:

#extension EXT_some_extension: enable

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

每个具有GLSL功能的OpenGL扩展都将拥有一个特定的#define。如果该扩展不存在,则enable标志仅会发出警告。如果它未激活,则#ifdef不会触发。


0

GLSL版本直接映射到OpenGL版本。在OpenGL-3.2之前和包括OpenGL-3.2,映射如下:

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代码”扩展有什么关系? - Nicol Bolas
@NicolBolas:只是一个类比:就像GLSL的支持可以通过在GLSL之外做一些事情来确定一样,GLSL扩展的可用性取决于特定OpenGL扩展的存在,这些扩展由OpenGL扩展字符串报告。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接