【发布时间】: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