我有两个 2D 纹理。第一个是 MSAA 纹理,使用的目标为GL_TEXTURE_2D_MULTISAMPLE
。第二个非 MSAA 纹理使用的目标为GL_TEXTURE_2D
.
根据 OpenGL 的ARB_texture_multisample 规范 https://www.opengl.org/registry/specs/ARB/texture_multisample.txt, only GL_NEAREST
当绘制 MSAA 纹理时,这是一个有效的过滤选项。
在这种情况下,这两个纹理都附加到GL_COLOR_ATTACHMENT0
通过它们各自的 Framebuffer 对象。它们的分辨率也相同(据我所知,当将 MSAA 传输到非 MSAA 时,这是必要的)。
因此,考虑到当前的限制,如果我将持有 FBO 的 MSAA blit 到持有 FBO 的非 MSAA,我是否还需要使用GL_NEAREST
作为过滤选项,或者是GL_LINEAR
有效,因为两个纹理都已渲染到?
过滤选项仅在您样本来自纹理。当你的时候他们不扮演任何角色渲染到纹理。
当从多样本纹理中采样时,GL_NEAREST
确实是唯一受支持的过滤器选项。您还需要使用特殊的采样器类型(sampler2DMS
)在GLSL代码中,带有相应的采样指令。
实际上我在规范中找不到任何内容说明将过滤器设置为GL_LINEAR
对于多重采样纹理是一个错误。但根本没有使用过滤器。来自 OpenGL 4.5 规范(添加了重点):
当在着色器中访问多样本纹理时,访问采用一个整数向量来描述要获取的纹理元素,以及与第 14.3.1 节中描述的样本编号相对应的整数,以确定要获取纹理元素内的哪个样本。多重采样纹理目标不允许使用标准采样指令,并且不执行过滤通过获取。
用于在多重采样和非多重采样纹理之间进行位块传送glBlitFramebuffer()
, the filter参数可以是GL_LINEAR
or GL_NEAREST
,但在本例中它被忽略。从 4.5 规范开始:
如果读取帧缓冲区是多重采样的(其 SAMPLE_BUFFERS 的有效值为 1),而绘制帧缓冲区不是(其 SAMPLE_BUFFERS 的值为零),则与源中每个像素位置对应的样本在写入之前将转换为单个样本目的地。过滤器被忽略.
这是有道理的,因为在这种情况下有一个限制,即源矩形和目标矩形需要具有相同的大小:
如果读取或绘制帧缓冲区是多重采样的,并且提供给 BlitFramebuffer 的源矩形和目标矩形的尺寸不相同,则会生成 INVALID_OPERATION 错误。
由于滤镜仅在图像拉伸时应用,因此在这种情况下并不重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)