我有一个可以运行或不运行多重采样的应用程序。我从着色器中先前渲染的多重采样纹理中提取样本。是否有必要使用sampler2D或sampler2DMS编译不同版本的着色器,以访问纹理,具体取决于它是否为多重采样纹理?
我尝试通过sampler2DMS从非多重采样纹理中获取并且它可以工作,但我不知道这是否是根据规范的未定义行为,或者我可以依赖它来工作多少。
有谁知道这是否是正确定义的行为?
答案 0 :(得分:0)
您创建的每个纹理对象has target associated with it。当您首次将该对象绑定到上下文时,您传递了glBindTexture
特定的目标枚举。 GL_TEXTURE_2D
,GL_TEXTURE_CUBE_MAP
等。您在第一次绑定调用中使用的目标与纹理对象密不可分;如果您尝试将其与其他目标绑定,glBindTexture
将失败。
GL_TEXTURE_2D
和GL_TEXTURE_2D_MULTISAMPLE
是不同的目标。如果使用glBindTexture(GL_TEXTURE_2D, obj)
绑定新创建的纹理对象,则无法以后将其与GL_TEXTURE_2D_MULTISAMPLE
绑定。反之亦然。
GLSL samplers types有后缀。那么,这些后缀表示特定采样器类型使用的纹理类型。 sampler2D
是一个与GL_TEXTURE_2D
纹理一起使用的浮点采样器。因此,它只能找到具有相应目标的纹理。
如果您设置sampler2D
制服以使用纹理单位0,并将某些标记绑定到GL_TEXTURE_2D_MULTISAMPLE
,则该采样器将无法看到它。它只会查找与该采样器绑定的GL_TEXTURE_2D
。
现在,你可能听说过view textures。这些是与其他纹理共享存储的纹理。但是视图可以具有不同的尺寸甚至纹理目标。您可以将2D阵列纹理中的单个图层视为2D纹理。等等。
您无法执行的转换中,将多重采样纹理视为非多重采样纹理。反之亦然。
因此,如果你所描述的有效,那就是未定义的行为。你不能依赖它。
话虽如此:
是否有必要编译着色器的不同版本
没有;你不能使用一个变量。拥有两个不同类型的采样器变量并且有条件地决定采样一个与另一个相比,这是完全有效的。如果条件是动态一致的(对于GL 4.x),则为won't even lose your implicit derivatives
您唯一需要做的就是让他们使用不同的纹理单位。不要尝试玩游戏,你可以为它们分配相同的纹理单元,并根据你绑定的内容决定使用哪个。它不起作用(或者如果它起作用,它是UB)。