微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

渲染到目标有些有 MSAA,有些没有

如何解决渲染到目标有些有 MSAA,有些没有

我有 6 个纹理。 有些是通过 :-

初始化的
void glTexImage2DMultisample(   GLenum target,GLsizei samples,GLenum internalformat,GLsizei width,GLsizei height,GLboolean fixedsamplelocations);

一些(例如用于描边/延迟着色/特殊效果)是通过以下方式初始化的:-

glTexImage2D( ... );

(主要问题) 是否可以同时渲染所有这些?即如何混合 MSAA 类型的渲染目标?

我已经尝试过了,但出现错误 36182
来自 Multi-sampling Frame Render Objects and Depth Buffers错误意味着:-

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 如果 GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 对所有附加的都不相同 纹理;或者,如果附加的图像是渲染缓冲区和 纹理,GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 的值不是 所有附加纹理的 GL_TRUE。

或许,这样的操作是不被允许的?我已经搜索了一些解释:-

  1. 来自https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2DMultisample.xhtml :-

fixedsamplelocations = 指定图像是否将使用相同的样本位置和相同数量的样本 图像中的纹素,样本位置将不依赖于 图像的内部格式或大小。,

  1. https://learnopengl.com/Advanced-OpenGL/Anti-Aliasing 说:-

如果最后一个参数 (fixedsamplelocations) 设置为 GL_TRUE,图像将使用相同的 每个纹素的样本位置和相同数量的子样本。

^ 尽管如此,还是有一些我不知道的专业术语。

  • 什么是sample locationsample locations 在 glsl 着色器中是否表示 glLocation
    我想它与 GLsizei samples 相同,例如主要是 1 或 4。如果是 4,则 1 个像素 = 4 个样本。
  • internal format 是否与 GL_[components​][size​][type​] 类似?
  • 为什么 the sample locationsinternal format 相关?
  • 因此我不明白 fixedsamplelocations 的实际含义。
    许多示例使用 GL_TRUE。什么时候应该是 GL_FALSE?

解决方法

在单个 FBO 中,图像要么全部进行多重采样,要么全部未进行多重采样。否则(即使 MS 图像的样本数为 1)将导致 framebuffer completeness error。不仅所有图像都必须是多重采样或非多重采样,所有图像还必须具有相同的样本数(非多重采样图像的样本数为 0)。

所以你想要的东西是不被允许的。


关于固定样本位置的内容是一个完全独立的问题。

特定样本计数的多样本图像在每个像素中具有相同数量的样本。但是,当出于抗锯齿目的进行渲染时,最好根据屏幕的像素区域来改变这些样本的位置。这提高了多重采样产生的抗锯齿的质量,因为它最大限度地减少了相邻样本模式之间的任何一致性。

如果您启用固定示例位置,您将强制实施不这样做。所以你会得到降低的抗锯齿质量。如果您有一些依赖于样本的一致位置的着色器计算,则只需要打开它。这通常是因为您正在手动进行多样本解析(而不是使用 blit)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。