繁体   English   中英

GLSL:将非多重采样纹理与sampler2DMS一起使用是否出错

[英]GLSL: is it an error to use a non-multisampled texture with a sampler2DMS

我有一个可以在有或没有多重采样的情况下运行的应用程序。 我正在从着色器中先前渲染的多样本纹理中获取样本。 是否有必要使用sampler2D或sampler2DMS编译不同版本的着色器以访问纹理,具体取决于它是否是多样本纹理?

我试图通过sampler2DMS从非多重采样纹理中获取内容,并且可以正常工作,但是我不知道这是否是规范未定义的行为,或者我有多少可以依靠它来工作。

有谁知道这是否是正确定义的行为?

您创建的每个纹理对象都有与之关联的目标 当您第一次将该对象绑定到上下文时,您向glBindTexture传递了一个特定的目标枚举。 GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP等。您在第一个绑定调用中使用的目标已与纹理对象密不可分; 如果尝试将其绑定到其他目标,则glBindTexture失败

GL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLE不同的目标。 如果将新创建的纹理对象与glBindTexture(GL_TEXTURE_2D, obj)绑定,则以后无法将其与GL_TEXTURE_2D_MULTISAMPLE绑定。 反之亦然。

您可能已经注意到, GLSL采样器类型带有后缀。 好吧,这些后缀表示特定采样器类型使用的纹理类型。 sampler2D是可用于GL_TEXTURE_2D纹理的浮点采样器。 因此,它将仅找到具有相应目标的纹理。

如果将sampler2D统一设置为使用纹理单元0,并将somethign绑定到GL_TEXTURE_2D_MULTISAMPLE ,则该采样器将看不到它 它只会寻找绑定到该采样器的GL_TEXTURE_2D

现在,您可能已经听说过view textures 这些是与其他纹理共享存储的纹理。 但是视图可以具有不同的尺寸甚至纹理目标。 您可以将2D阵列纹理中的单个图层视为2D纹理。 依此类推。

无法执行的转换中,将多样本纹理视为非多样本纹理。 或相反亦然。

因此,如果您描述的有效,那就是未定义的行为。 而且您不能依靠它。

话虽如此:

是否有必要编译不同版本的着色器

没有; 您只是不能使用一个变量。 拥有两个不同类型的采样器变量并有条件地决定一个采样还是另一个采样是完全有效的。 如果条件是动态一致的(对于GL 4.x),您甚至不会丢失隐式导数

您唯一要做的就是使它们使用不同的纹理单位。 不要尝试在游戏中为它们分配相同的纹理单元,并让其根据绑定的内容来决定使用哪个纹理单元。 它不起作用(或者,如果起作用,则为UB)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM