c++ - 渲染到目标。有些有 MSAA,有些没有
问题描述
我有 6 个纹理。有些是通过以下方式初始化的:-
void glTexImage2DMultisample( GLenum target,
GLsizei samples,
GLenum internalformat,
GLsizei width,
GLsizei height,
GLboolean fixedsamplelocations);
一些(例如,用于中风/延迟着色/特殊效果)通过以下方式初始化:-
glTexImage2D( ... );
(主要问题)是否可以一次渲染所有这些?即如何混合 MSAA 类型的渲染目标?
我试过了,但我得到了错误36182
。
来自多采样帧渲染对象和深度缓冲区。错误意味着: -
如果所有附加纹理的 GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 的值不同,也会返回 GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;或者,如果附加图像是渲染缓冲区和纹理的混合,则所有附加纹理的 GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 的值不是 GL_TRUE。
也许,这样的操作是不允许的?我已经搜索了一些解释:-
fixedsamplelocations = 指定图像是否对图像中的所有纹素使用相同的样本位置和相同数量的样本,并且样本位置将不取决于图像的内部格式或大小。,
如果最后一个参数 (fixedsamplelocations) 设置为 GL_TRUE,则图像将使用相同的样本位置和每个纹素的相同数量的子样本。
^ 然而,有一些我不知道的技术词汇。
- 什么是
sample location
? glsl着色器的sample locations
意思是什么? 我猜它与 相同,例如大部分是 1 或 4。如果是 4,则 1 像素 = 4 个样本。glLocation
GLsizei samples
- 这
internal format
意味着什么GL_[components][size][type]
? - 为什么
the sample locations
相关internal format
? - 因此,我不明白
fixedsamplelocations
实际上是什么意思。
许多示例使用 GL_TRUE。什么时候应该是 GL_FALSE?
解决方案
在单个 FBO 中,图像要么全部经过多重采样,要么全部不经过多重采样。否则(即使 MS 图像的样本计数为 1)将导致帧缓冲区完整性错误。不仅所有图像必须经过多重采样或非多重采样,所有图像还必须具有相同的样本数(非多重采样图像的样本数为 0)。
所以你想要的东西是不允许的。
固定样本位置上的东西是一个完全独立的问题。
特定样本计数的多样本图像在每个像素中具有相同数量的样本。但是,在为抗锯齿目的进行渲染时,最好根据屏幕像素区域来改变这些样本的位置。这提高了多重采样产生的抗锯齿的质量,因为它最大限度地减少了相邻样本模式之间的任何相干性。
如果您打开固定样本位置,您将强制实现不执行此操作。因此,您将获得降低的抗锯齿质量。如果您有一些依赖于样本的一致位置的着色器计算,您只需要打开它。这通常是因为您正在手动进行多样本解析(而不是使用 blit)。
推荐阅读
- javascript - React Router - 如果未定义前一个参数,则未定义参数
- jenkins - 结合 Jenkins 流水线中并行阶段的 C++ 覆盖结果
- ios - 防止表格视图单元格在单元格操作后关闭
- android - 如何处理片段内的 UI 事件的简单方法(onClick,...)
- c++ - 如果我删除 C++ 程序正在向其写入数据的文件会发生什么?
- python - python:了解多个版本、符号链接和 virtualenv
- django - dj-stripe UpcomingInvoice 用法
- android - 对 Dagger2 中的所有构造函数使用 @Inject 是可选的吗?
- javascript - 如何将完整的表格放在一个框架中?
- testing - 可以在关键字“运行关键字”中分配变量吗?