基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿

Vries的教程是我看过的最好的可编程管线OpenGL教程,没有之一,其原地址如下,https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/11%20Anti%20Aliasing/ 关于抗锯齿的详细知识了解请看原教程,本篇旨在对Vires基于visual studio平台的编程思想与c++代码做纯Qt平台的移植,代码移植顺序基本按照原教程顺序,并附加一些学习心得,重在记录自身学习之用

Tip1: 这篇没有源代码提供下载,因为在Qt下只要增添四行代码就可实现抗锯齿。

Tip2: 与Vries所使用的glfw窗口框架一样,Qt框架同样为我们提供了多重采样缓冲这个功能。

 

一. 如何在Qt中开启抗锯齿

    因为QOpenGLWidget类继承了QWidget类,我们可以通过修改他的format()来更改多重采样缓冲的采样点数量。

  构造函数(){
    ......
    QSurfaceFormat newGLFormat = this->format();  //开启抗锯齿
    newGLFormat.setSamples(4);
    this->setFormat(newGLFormat);
   {

  void initializeGL(){
    ......
    core->glEnable(GL_MULTISAMPLE); //  QOpenGLFunctions_3_3_Core *core;
  }

   四行代码即可搞定,设置采样点数量为4

  以下左图为未开抗锯齿,右图为开启MSAA(Multisample Anti-aliasing,多重采样抗锯齿),采样点为4,效果还是很明显的。

基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿_第1张图片基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿_第2张图片

二. 多重采样抗锯齿(MSAA)是个啥

    首先,显示屏永远是一堆细小的网格组成的,也就是我们常说的分辨率,比如800x600分辨率,可以简单理解成整个显示屏幕是由600行,800列的网格组成。所以像素颜色终究不会是流线分布的,而是一块一块的。所以如何决定像素块的颜色呢。

以下图这个三角形为例,在顶点着色器中,我们可以指定三角形的三个顶点,且将这三点连线,如左图。但映射到片段着色器上时,必须决定哪个像素块绘成红色,哪个像素块绘成白色,默认方法是,每个像素网格都有一个中心点,当所绘制的区域覆盖这些中心点时,我们就将这个中心点所在的像素块绘制成红色。如右图所示,这就有了坑坑洼洼的显示效果。

基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿_第3张图片基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿_第4张图片

    而MSAA是啥呢?将像素块中的一个中心点改为四个,然后插值计算。比如左图中圈起的像素块,有一个中心点被覆盖,三个没有。最终这个像素块在片段着色器中的渲染颜色为 

fragColor = 0.25 * 红 + 0.75 * 白;

  方法就是这么简单粗暴。所以最终这个像素块会显示处淡红色。拉远看,就会感觉边缘线条很流畅,而不是像以前那样坑坑洼洼。

基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿_第5张图片基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿_第6张图片

三. 离屏MSAA

   关于Vries这部分的内容,就看原教程吧,主要讲怎么通过帧缓冲技术,而不用通过glfw或qt窗口框架自带的那一套,来实现抗锯齿,挺麻烦的,,,真的。我感觉大部分穿格子衫的程序人也不会这么干。

基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十六)抗锯齿_第7张图片

你可能感兴趣的:(现代OpenGL学习教程)