0

在常规 GLSL 中,我可以执行以下操作来有条件地启用 GLSL 扩展:

#if defined(GL_ARB_shader_viewport_layer_array)
    #extension GL_ARB_shader_viewport_layer_array : enable
    // Some other stuff here
#endif

我的问题是,如何使用 glslang 库在 SPIR-V 中实现相同的目标?我假设我需要编译同一个着色器的多个版本来实现这一点?或者有没有办法在不为两个版本生成两个二进制文件的情况下,以扩展的存在为条件对 SPIR-V 进行条件化?

4

1 回答 1

2

在常规 GLSL 中,我可以执行以下操作来有条件地启用 GLSL 扩展:

首先,不,你不能。并非每个 OpenGL 扩展或 GLSL 都公开了这样的#define。例如,在GL_ARB_shader_viewport_layer_array 扩展中,您不会发现该定义被指定在那里。相比之下,GL_ARB_shader_group_vote 扩展确实指定了一个#define.

其次,即使扩展提供了#define,它仍然不起作用。因为仅当您使用 #extension 指令激活扩展时才会公开 #define 。所以你的例子永远不会让 shader_viewport_layer_array 工作。

如果您希望有条件地存在扩展名,请使用#extension NAME : enable. 如果实现不支持扩展,您将不会得到它(您将在着色器日志文件中收到警告)。您可以使用前面讨论的#define检测扩展是否处于活动状态。

至于如何用 SPIR-V 做到这一点……你不知道。SPIR-V 是一种中间语言,而不是高级语言。期望 SPIR-V 是针对特定版本的主机环境编写的,包括扩展。如果您想有条件地支持某些扩展而不支持其他扩展,则必须为您打算支持的那些扩展组合生成多个 SPIR-V 着色器。

SPIR-V 不等同于#ifdef,同样因为它是一种中间语言。

于 2018-03-10T15:02:34.663 回答