OpenGL-油画法

2019-05-16  本文已影响0人  Tobesky

渲染中可能出现的问题

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

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

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

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

渲染问题

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

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

油画法

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

油画法

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

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

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

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

当然有!

比如下面的这张图

叠加

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

上一篇 下一篇

猜你喜欢

热点阅读