Opengl GLSL:检查是否支持扩展

Opengl GLSL:检查是否支持扩展,opengl,glsl,Opengl,Glsl,您不能使用不受支持的扩展,驱动程序将返回编译错误。但您能直接从GLSL代码检查一些扩展的可用性吗?有这样的东西吗 #version XXX core #if supported(EXT_some_extension) #extension EXT_some_extension: enable #endif ... 更新:根据Nicol的Bolas回答。是的,这也出现在我的脑海中,但出于某种原因,它不起作用 #version 150 core #extension ARB_explicit_a

您不能使用不受支持的扩展,驱动程序将返回编译错误。但您能直接从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
指令而没有任何条件,它将使用它(我的驱动程序支持它)。看起来扩展没有被定义,它是其他的(可能是?)(
#如果定义了(ARB_explicit_attrib_location)
也不起作用)

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获取一个字符串数组,这些字符串在内部连接。这可用于在实际着色器代码之前传递带有预处理器定义的字符串。当然,
#版本…
令牌仍然必须优先于其他一切

#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

版本号与检查来自“GLSL代码”的扩展名有什么关系?@Nicolas:只是一个类比:以相同的方式,可以通过在GLSL“外部”执行某些操作来确定支持的GLSL,GLSL扩展的可用性取决于特定OpenGL扩展的存在,这是由OpenGL扩展字符串报告的。Nicol Bolas是正确的。您刚刚忘记了扩展定义的
GL\uu
前缀…刚刚意识到这一点。谢谢你的帮助。