OpenGL多重采样:结果与未使用多重采样时的结果相同

时间:2016-06-03 21:31:41

标签: opengl antialiasing

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

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

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

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);

整个代码似乎并不完全错误,因为输出是所需的形状,除了抗锯齿效果。 问题是: 要么我使用多重采样(不同的样本数为2 4或8),要么我不使用多重采样,结果是相同的。我特意将结果写入图像,并将它们并排比较。

但是如果多重采样生效,那么结果应该比不使用多重采样时具有更少的混叠效果。

1 个答案:

答案 0 :(得分:3)

  

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

多重采样的基本思想是你进行与非多重采样相同数量的片段着色器调用,但是一个特定的片段只根据 geometry 你渲染的基元。你正在渲染我认为是四边形的东西;任何明显的几何体都是片段着色器创建的虚构。因此,你没有从这项技术中获益。

基于冒名顶替的技术通常不会受益于多重采样。

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

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

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