OpenGL multisample:结果与不使用 multisample 时相同
OpenGL multisample: the results are the same as that when multisample not used
在 QT 框架中使用 OpenGL(版本 330)多重采样。
渲染图像星形。
我使用片段着色器在黑色 canvas 上渲染形状强度。
我不使用 OpenGL 原语。
当不使用多重采样时,当渲染输出 canvas 具有较小的分辨率(比如 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),要么我不使用多重样本,结果都是一样的。我特地把结果写成图片,并排比较。
但是如果多重采样生效,结果应该比不使用多重采样时具有更少的混叠效果。
I use fragment shader to render the shape intensity on the black canvas. I do not use OpenGL primitives.
多重采样的基本思想是,您执行与非多重采样相同数量的片段着色器调用,但特定片段仅根据 将输出写入每个像素中的特定样本您渲染的图元的几何图形。您正在渲染我认为是四边形的东西;任何明显的几何体都是由片段着色器创建的虚构。因此,您没有从该技术中获得任何好处。
基于冒名顶替的技术通常不会受益于多重采样。
当然有办法处理这个问题。最明显的是打开每个样本的着色,但这也有效地将多重采样变成了超级采样。也就是说,它并不便宜。
一个更好的主意是explicitly output a coverage mask with gl_SampleMask
。这并不容易,它取决于您如何生成几何图形。这个想法是,对于片段覆盖的每个样本,检测该样本是否在冒名顶替者生成的几何图形内。如果是这样,将该样本的掩码设置为 1;如果不是,则将其设置为 0。因此,您生成 1 个输出值,并将其广播到非零样本。
此着色和每个样本着色都需要 GL 4.0+(或 ARB_sample_shading)。
在 QT 框架中使用 OpenGL(版本 330)多重采样。
渲染图像星形。 我使用片段着色器在黑色 canvas 上渲染形状强度。 我不使用 OpenGL 原语。 当不使用多重采样时,当渲染输出 canvas 具有较小的分辨率(比如 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),要么我不使用多重样本,结果都是一样的。我特地把结果写成图片,并排比较。
但是如果多重采样生效,结果应该比不使用多重采样时具有更少的混叠效果。
I use fragment shader to render the shape intensity on the black canvas. I do not use OpenGL primitives.
多重采样的基本思想是,您执行与非多重采样相同数量的片段着色器调用,但特定片段仅根据 将输出写入每个像素中的特定样本您渲染的图元的几何图形。您正在渲染我认为是四边形的东西;任何明显的几何体都是由片段着色器创建的虚构。因此,您没有从该技术中获得任何好处。
基于冒名顶替的技术通常不会受益于多重采样。
当然有办法处理这个问题。最明显的是打开每个样本的着色,但这也有效地将多重采样变成了超级采样。也就是说,它并不便宜。
一个更好的主意是explicitly output a coverage mask with gl_SampleMask
。这并不容易,它取决于您如何生成几何图形。这个想法是,对于片段覆盖的每个样本,检测该样本是否在冒名顶替者生成的几何图形内。如果是这样,将该样本的掩码设置为 1;如果不是,则将其设置为 0。因此,您生成 1 个输出值,并将其广播到非零样本。
此着色和每个样本着色都需要 GL 4.0+(或 ARB_sample_shading)。