抗锯齿
-
遇到模型边缘有锯齿:光栅器将顶点数据转化为片段的方式有关
- 抗锯齿:产生更平滑的边缘
- SSAA超采样抗锯齿:
- 使用比正常分辨率更高的分辨率,来渲染场景,它也会带来很大的性能开销。
光栅器:
- 位于最终处理过的顶点坐标之后到片段着色器之前所经过的所有的算法与过程的总和的映射(背后的实际逻辑十分复杂),会将一个图元的所有顶点作为输入,并将它转换为片段/屏幕坐标(像素)。
- 形成像素:屏幕有分辨率:屏幕像素的网格,每个像素的中心包含有一个采样点(Sample Point),当采样点被被顶点连线范围遮盖,那么采样点对于的像素会生成一个片段
- 本质:光栅化阶段,由于屏幕的分辨率,屏幕像素总量的限制,顶点坐标与片段之间几乎永远也不会有一对一的映射,有些边缘的像素能够被渲染出来,而有些则不会。
MSAA多重采样抗锯齿:
- 多重采样所做的正是将单一的采样点变为多个采样点,根据覆盖的子采样点个数,决定这个像素的颜色
- 如何计算插值的像素颜色?
- 每个像素只运行一次片段着色器。结果颜色会被储存在被遮盖的子样本中,当颜色缓冲的子样本被图元的所有颜色填满时,所有的这些颜色将会在每个像素内部平均化。
- 不仅仅是颜色值会受到多重采样的影响,深度和模板测试也能够使用多个采样点
如何使用?
- 多重采样缓冲(Multisample Buffer):必须要使用一个能在每个像素中存储大于1个颜色值的颜色缓冲,来存储特定数量的多重采样样本
- glfwWindowHint:大多数的窗口系统都应该提供了一个多重采样缓冲,提示(Hint) GLFW,我们希望使用一个包含N个样本的多重采样缓冲,现在再调用glfwCreateWindow创建渲染窗口时,每个屏幕坐标就会使用一个包含N个子采样点的颜色缓冲了
- 调用glEnable并启用GL_MULTISAMPLE,来启用多重采样。
离屏渲染 && MSAA:
-
glfwWindowHint只是针对默认帧缓冲,如果我们想要使用我们自己的帧缓冲来进行离屏渲染(渲染到非默认帧缓冲),那么我们就必须要自己动手生成多重采样缓冲(纹理附件和渲染缓冲附件:颜色缓冲以及/或深度和模板缓冲)了。
-
多重采样帧缓冲(附件绑定点&&内存分配):Bind-> GL_TEXTURE_2D_MULTISAMPLE,分配内存……Multisample(……,samples,……)
- 多重采样帧缓冲对象有一点特别,无法对它采样(使用纹理坐标获取纹理颜色),普通的纹理采样器为sampler2D,以及后期处理效果
- 需要建立普通帧缓冲(普通纹理附件),在while帧缓冲解绑前,glBlitFramebuffer(传送(Blit)),
- 将帧缓冲分开绑定至GL_READ_FRAMEBUFFER与GL_DRAW_FRAMEBUFFER读写目标,将多重采样的帧缓冲传送到普通的帧缓冲纹理附件上,最后绑定的纹理为普通的纹理