6

您不能使用不受支持的扩展,驱动程序将返回编译错误。但是你能直接从 GLSL 代码检查某些扩展的可用性吗?有这样的事情吗?

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

...

更新:根据NicolBolas回答。是的,这也出现在我的脑海中,但由于某种原因,它不起作用

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

4

2 回答 2

20
#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则不会触发。

于 2013-08-03T23:43:46.223 回答
1
于 2013-08-03T23:24:58.037 回答