在QT框架中使用OpenGL (Version330)多示例。
渲染图像就像一个星型。我使用碎片着色器在黑色帆布上渲染形状强度。我不使用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);整个代码似乎不是完全错误的,因为输出是期望的形状,除了抗混叠效应。问题是:要么我使用多样本(不同样本编号为2 4,或者8),要么我不使用多样本,结果是相同的。我特别把结果写成图片,并排比较。
但是,如果多采样生效,结果应该比不使用多重枫叶时具有更小的混叠效应。
发布于 2016-06-03 22:52:09
我使用碎片着色器在黑色帆布上渲染形状强度。我不使用OpenGL原语。
多采样的基本思想是,您正在执行与非多采样相同的片段着色器调用,但特定片段仅根据您呈现的原语的几何形状将输出写入每个像素中的特定样本。你呈现的是一个四边形,任何明显的几何学都是由碎片着色器创造的虚构。因此,您没有从这项技术中获益。
基于冒名顶替的技术通常不会从多次抽样中获益。
当然,有办法处理这件事。最明显的是打开每个样本的阴影,但这也有效地将多采样转化为超采样。也就是说,它不便宜。
一个更好的主意是gl_SampleMask。这并不容易,这取决于你如何生成你的几何图形。这个想法是,对于一个片段所涵盖的每一个样本,检测该样本是否在假冒伪劣生成的几何图形中。如果是,将该示例的掩码设置为1;如果没有,则将其设置为0。因此,您生成一个输出值,并将其广播到非零样本。
这和每个样本的阴影都需要GL 4.0+ (或ARB_sample_shading)。
https://stackoverflow.com/questions/37623757
复制相似问题