【问题标题】:OpenGL multisample: the results are the same as that when multisample not usedOpenGL multisample:结果与未使用 multisample 时的结果相同
【发布时间】:2016-06-03 21:31:41
【问题描述】:

在 QT 框架中使用 OpenGL(版本 330)多重采样。

渲染图像就像一个星形。 我使用片段着色器在黑色画布上渲染形状强度。 我不使用 OpenGL 原语。 当不使用多重采样并且渲染输出画布具有较小的分辨率(例如 400x400 像素)时,我可以看到沿星形边缘的锯齿效果。 如果我提高分辨率,比如 1500x1500 像素,那么锯齿效果就不会那么明显了。所以我认为多采样应该能够改善结果。

现在,为了提高速度,我不增加渲染缓冲区的分辨率。相反,我决定尝试使用多重采样来减少混叠效应。

int num_samples = 2; // 4; // I guess the maximum for most graphic cards are 8

GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
glTexImage2DMultisample( GL_TEXTURE_2D_MULTISAMPLE, num_samples, GL_R11F_G11F_B10F, width, height, true );

GLuint fbo;
glGenFramebuffers( 1, &fbo );
glBindFramebuffer( GL_FRAMEBUFFER, fbo );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0 );

glViewport(0,0, width, height);
glEnable(GL_MULTISAMPLE);

// ... some code
// draw a rectangle, as it is 2D image processing
// OpenGL render program release

// now convert multisample frame buffer fbo to a regular frame buffer qopenglFramebufferOjbectP 
// qopenglFramebufferOjbectP is QOpenGLFramebufferObject
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, qopenglFramebufferOjbectP->handle());
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

整个代码似乎并没有完全错误,因为输出是所需的形状,除了抗锯齿效果。 问题是: 要么我使用 multisample(不同的样本数为 2 4 或 8),要么我不使用 multisample,结果是相同的。我特地把结果写成图片,并排比较。

但是如果多重采样生效,则应该预期结果的混叠效果会比不使用多重采样时的效果要小。

【问题讨论】:

  • “但是如果多重采样生效,结果应该是不同的,因为结果不统一。”是什么意思?目前尚不清楚您到底在画什么,以及您希望从多重采样中得到什么。
  • @derhass 我更新了文本以使其更清晰:渲染图像就像一个星形。当不使用多重采样并且渲染输出画布具有较小的分辨率(例如 400x400 像素)时,我可以看到沿星形边缘的锯齿效果。 // 但是如果multisampling生效了,应该期望结果比不使用multismaple时有更少的锯齿效果。
  • 您实际上是在使用 GL 基元绘制星形,还是只是在绘制一些带纹理的矩形?
  • @derhass 我使用片段着色器在黑色画布上渲染形状强度。我不使用 OpenGL 原语。我在我的问题中添加了描述。所以我的问题是,多重采样纹理至少成功渲染了一些东西(所以代码在一定程度上起作用),只是多重采样抗锯齿效果似乎没有出现。
  • 默认多重采样不一定是超级采样,因此在您的用例中对您没有帮助。您可以通过启用每样本着色来改进这一点。

标签: opengl antialiasing


【解决方案1】:

我使用片段着色器在黑色画布上渲染形状强度。我不使用 OpenGL 原语。

多重采样的基本思想是,您正在执行与非多重采样相同数量的片段着色器调用,但特定片段仅根据几何形状将输出写入每个像素中的特定样本> 您渲染的基元。您正在渲染我认为是四边形的东西;任何明显的几何图形都是片段着色器创建的虚构。因此,您没有从该技术中获得任何好处。

基于 Imposter 的技术通常不会从多重采样中受益。

当然,有办法处理这个问题。最明显的是打开逐样本着色,但这也有效地将多重采样转换为超级采样。也就是说,它并不便宜。

一个更好的主意是explicitly output a coverage mask with gl_SampleMask。这并不容易,这取决于您如何生成几何图形。这个想法是,对于片段覆盖的每个样本,检测该样本是否在冒名顶替者生成的几何体中。如果是,则将该样本的掩码设置为 1;如果不是,则将其设置为 0。因此,您生成 1 个输出值,并将其广播到非零样本。

此着色和逐样本着色都需要 GL 4.0+(或 ARB_sample_shading)。

【讨论】:

  • 你的意思是OpenGL多重采样功能只适用于OpenGL原始绘图吗?就像 Wiki 中所说的那样,“通过多重采样,多边形边缘的每个像素都会被多次采样。”。所以它只会在图元的边缘多次采样。谢谢!
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2014-11-20
  • 2021-07-17
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多