OpenGL_多重抗锯齿采样

平时采样,都是一个像素里一个采样点。如果这个采样点在图元里面,那么就是图元的颜色,反之就不是

这样相邻像素之间的颜色差值会很大。

抗锯齿采样有一个比较好的解决方法,但是耗费性能很大:就是SSAA(Super Sampling AA)。提高分辨率绘制图像。然后再对绘制好的图像进行下采样。但是提高分辨率,像素点也会成倍的增加,着色器会被调用更多次。

还有一个解决方法是:MSAA。 可以通过增加在一个像素内的采样点。比如说从原来的一个增加到四个。这样对于图元内部的像素,还是图元的颜色。在图元边缘上的像素,在图元内部的采样点就是图元的颜色,反之不是。然后再对这四个采样点进行求平均值。这样,对于每一个像素,还是调用了一次着色器,性能并没有过多消耗。只是颜色缓冲增加为原来的四倍。

离屏渲染MSAA,就是现在帧缓冲里绘制好了之后,把帧缓冲里的图像再转到屏幕上的帧缓冲里。

帧缓冲的操作是:先绑定一个多重采样的颜色缓冲附件,然后在渲染到渲染缓冲对象的时候,指明是多重采样。

但是这样得到的纹理不能直接拿来用,因为采样点比普通的图像要多。

所以在帧缓冲进行转换的时候,要做一步还原。多重采样帧缓冲的还原通常是通过glBlitFramebuffer来完成,它能够将一个帧缓冲中的某个区域复制到另一个帧缓冲中,并且将多重采样缓冲还原。

当然,如果直接把多重采样的帧缓冲的纹理输出来做一个后期处理(在着色器里),也是可以的。  

没完全明白多重采样的帧缓冲转换到普通帧缓冲,以及多重采样的帧缓冲的纹理输出有什么区别?   不都是把帧缓冲里的颜色输出吗?   我想到的唯一区别是,纹理输出只是输出了一个纹理,但是帧缓冲转换,可以保留帧缓冲的颜色附件和渲染缓冲对象?

在着色器里纹理uniform采样器设置为sampler2DMS,而不是平常使用的sampler2D:使用texelFetch函数就能够获取每个子样本的颜色值了。

猜你喜欢

转载自blog.csdn.net/qq_40947718/article/details/81237682