美文网首页
OpenGL-油画法

OpenGL-油画法

作者: Tobesky | 来源:发表于2019-05-16 22:55 被阅读0次

渲染中可能出现的问题

我们知道,默认情况下所有我们渲染的点,线或者三角形都会在屏幕上进行光栅化,然后按照在组合批次时的指定顺序进行排列,而这就会导致一些问题,如三角形在物体的背面,我们本是看不到的却看到了,或者前面绘制的三角形被后面绘制的三角形覆盖。

为了更加清楚的表现这个问题,我们可以画一个甜甜圈来说明。
首先了解一个方法,在GLTools 里面已经为我们集成好了获得花托顶点数据的函数:

//得到花托的顶点数据
void gltMakeTorus(
    GLTriangleBatch& torusBatch, // 返回的三角形批次,和普通批次功能类似,是专门画三角形的批次
    GLfloat majorRadius, // 中心到外边缘的半径
    GLfloat minorRadius, // 外边缘到内边缘的距离
    GLint numMajor, // 片段数,即花托由多少个片段面组成
    GLint numMinor  // 堆叠数,即每个片段面由多少个顶点组成
); 
花托-点 花托-面

如上图所示,正常绘制完成后显示是没有问题的,但是当我们转动这个甜甜圈的时候就会发现图形出现了混乱,如下图所示:

渲染问题

那么思考一下🤔,该如何解决这个问题呢?

实际上,在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的,对于不可见的部分,应该尽早丢弃,例如在一个不透明的墙壁后,就不应该渲染,这种情况叫做“隐藏面消除(Hidden surface elimination)”

油画法

对于上面提到的问题,可能的解决方法之一是,对这些三角形进行排序,先渲染较远的三角形,再渲染较近的三角形,这种方式称为“油画法”

油画法

比如上图,我们依次绘制红色,黄色和灰色部分,就解决了隐藏面消除的问题。

可是我们再进一步思考一下,这样真的就能很好的解决所有问题吗?

实则不然,
首先我们观察一下,三个颜色区域叠加的部分,不论你是先画前面还是后面的,重叠的部分被多次绘制,这就带来了一个性能问题,所以说油画法渲染是非常低效的,重叠部分进行了多次写操作,三角形排序开销大,故而我们一般不采用

然后我们想,如果从顺序角度出发,那有没有一种情况是我们没办法确定顺序的呢?

当然有!

比如下面的这张图

叠加

所以像这种叠加的情况,就没办法按油画法来解决,因为油画法只是在场景里,按照物理距离观察者的距离远近排序去绘制的。

相关文章

  • OpenGL-油画法

    渲染中可能出现的问题 我们知道,默认情况下所有我们渲染的点,线或者三角形都会在屏幕上进行光栅化,然后按照在组合批次...

  • 伊人私语教你法式白边美甲画法

    伊人私语教你法式白边美甲画法 美甲工具:白色指甲油、粉色指甲油、护甲油、法式贴纸 美甲前准备:首先是...

  • OpenGL-初识

    Title: OpenGL-初识Date: 2016-06-15 10:00Modified: 2016-07-1...

  • OpenGL-由实例理解概念

    Title: OpenGL-由实例理解概念Date: 2016-07-10 22:00Modified: 2016...

  • OpenGL-纹理的初步应用

    Title: OpenGL-纹理的初步应用Date: 2016-08-06 01:30Modified: 2016...

  • 菊花国画基础教学绘画技法教程,不学到来真的是太可惜了

    一、菊花结构解析 二、菊花写意画法简介 三、菊花叶画法 四、露蕊菊花画法 五、白色菊花画法 六、金背大红菊花画法 ...

  • 【国画讲堂】 菊花画法步骤图解

    一、菊花结构解析 二、菊花写意画法简介 三、菊花叶画法 四、露蕊菊花画法 五、白色菊花画法 六、金背大红菊花画法 ...

  • OpenGL-矩阵

    一、使用矩阵堆栈 //类型GLMatrixStack::GLMatrixStack(int iStackDepth...

  • OpenGL-纹理

    纹理 纹理(Texture),简单理解就是一张二维图片,一张可以贴在物体表面的贴纸。 映射方式 纹理的(0,0)在...

  • OPenGL-纹理

    一常用函数 改变像素存储⽅方式 从颜⾊色缓存区内容作为像素图直接读取 载⼊纹理 常用: glTexImage2D ...

网友评论

      本文标题:OpenGL-油画法

      本文链接:https://www.haomeiwen.com/subject/lezwaqtx.html