【问题标题】:GLSL: check if an extension is supportedGLSL:检查是否支持扩展
【发布时间】:2021-03-23 20:21:22
【问题描述】:

您不能使用不受支持的扩展,驱动程序将返回编译错误。但是你能直接从 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) 也不起作用)

【问题讨论】:

  • 尼可波拉斯是正确的。您只是忘记了扩展定义的 GL_ 前缀...
  • 刚刚意识到这一点。谢谢你的帮助。

标签: opengl glsl


【解决方案1】:
#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 将不会触发。

【讨论】:

    【解决方案2】:

    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 … 令牌仍然必须排在其他所有内容之前。

    【讨论】:

    • 版本号与从“GLSL 代码”检查扩展有什么关系?
    • @NicolBolas:只是一个类比:与支持 GLSL 的方式相同,可以通过在 GLSL“外部”做一些事情来确定,GLSL 扩展的可用性取决于特定 OpenGL 扩展的存在,即由 OpenGL 扩展字符串报告。
    猜你喜欢
    • 2018-02-24
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多