在普通GLSL中,我可以这样做,以便有条件地启用GLSL扩展:
#if defined(GL_ARB_shader_viewport_layer_array)
#extension GL_ARB_shader_viewport_layer_array : enable
// Some other stuff here
#endif我的问题是,如何在SPIR中使用glslang库实现相同的目标?我假设我需要编译同一个着色器的多个版本才能实现这一点?或者,是否有一种方法可以在没有为两个版本生成两个二进制文件的情况下对SPIR的存在进行条件化?
发布于 2018-03-10 15:02:34
在普通GLSL中,我可以这样做,以便有条件地启用GLSL扩展:
首先,不,你不能。不是每个GLSL的OpenGL扩展都公开这样的定义。例如,在阵列扩展中的任何地方都找不到要指定的定义。相反,投票延期确实指定了一个#define。
第二,即使扩展提供了#define,但仍然无法工作。因为只有在使用#extension指令激活扩展时,#define才会公开。因此,您的示例将永远不会使shader_viewport_layer_array工作。
如果你想要一个延期须有条件存在,你可以使用#extension NAME : enable。如果实现不支持扩展,则不会得到它(您将在着色器日志文件中得到警告)。使用前面讨论的#define检测扩展是否处于活动状态。
至于如何用SPIR-V.你不知道。斯皮尔-V是中级语言,不是高级语言。人们期望SPIR是针对特定版本的主机环境编写的,包括扩展。如果您想要有条件地支持某些扩展,而不是其他扩展,您必须为您打算支持的扩展组合生成多个SPIR着色器。
SPIR-V与#ifdef没有任何等价之处,因为它是一种中间语言。
https://stackoverflow.com/questions/49210073
复制相似问题