您不能使用不受支持的扩展名,驱动程序将返回编译错误。但是,您可以直接从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)
也不起作用)
答案 0 :(得分:17)
#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
将不会触发。
答案 1 :(得分:1)
GLSL版本直接映射到OpenGL版本。在嵌入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 …
令牌仍然必须先于其他所有内容。