OpenGL --面剔除和深度测试

当我们以某一视角观察一个多面立体图形的时候,我们的肉眼只能看到一部分面积,也就是我们的视线正前方的面,例如观察一个圆柱体根据我们观察角度的不同我们只能看到一个曲面或者一个曲面加一个圆,观察一个立方体最多也只能看到三个面,所以为了提高渲染性能,我们完全没有必要去绘制我们看不到的面,在OpenGL中面剔除就可以实现这一需求。

面剔除(Face Culling)

在OpenGL中开启面剔除使用
glEnable(GL_CULL_FACE);

使用glFrontFace (GLenum mode);可以指定剔除模式参数为GL_CCWGL_CWGL_CCW为默认的模式,即以顶点逆时针连接方向为正面,以顶点顺时针连接方向连接为反面。图例如下:(图片来自www.learnopengl.com)。

图例.png

如上图立方体距离我们眼睛最近的一个面以顶点1>2>3连接顺序为正面,那么后面的那个面为反面。

使用glCullFace (GLenum mode);可执行剔除,参数可以是GL_BACKGL_FRONTGL_BACK_AND_FRONT,分别是背面剔除、正面剔除、正面反面都剔除。
面剔除除了可以提升渲染性能,还可以解决图元在光栅化渲染的时候由于三角形绘制顺序出错而导致图形的反面覆盖在图形的正面上的显示错误。图例如下:

旋转前.png

旋转后.png

如上图所示,绘制一个像游泳圈一样的立体图形,通过键盘来控制图形旋转,但是旋转后我们会发现图形出现了一些黑色的条,这种情况就是因为图形旋转重新渲染时在光栅化渲染时会把图元分解为一个个三角形,如果先渲染正面的三角形后渲染反面的三角形,那么三角形重叠的部分就会是反面的三角形覆盖在了正面的三角形上,从而出现了我们在上图看到的那种情况。

以点显示.png

通过上图可以很直观的看到图形的反面是黑色的,并且在上方出现了黑色覆盖了红色的情况。
所以我们可以通过反面剔除来解决这个问题。
在使用背面剔除的时候可能会出现重叠部分剔除多了的情况(如下图所示),这种情况我们可以使用开启深度测试来解决。
重叠部分剔除多了.png

深度测试(GL_DEPTH_TEST)

在OpenGL中深度指的就是在坐标系中像素Z的值,距离观察者的距离,观察者可以在任何位置,OpenGL中会有专门一块缓存区来存放Z值--深度缓存区,来存放每个像素上的Z值。

  • 深度缓存区的作用
    一般情况下,我们绘制图形时,后面绘制的会覆盖前面的图形,绘制的顺序为先后面后前面,这样就会产生一个性能问题,先绘制的会被后绘制的覆盖掉,显然这是没有任何意义的,上面介绍过通过剔除法可以剔除背面的图形,从而提高性能,深度测试也可以解决这个问题,在有了深度缓存区后,绘制的时候会检查Z值,靠近观察者的覆盖,而不是靠绘制顺序来决定的。

  • 如何使用深度缓存区测试
    使用glEnable(GL_DEPTH_TEST);来开启深度测试。

    默认情况下,Z值小的面会被覆盖。
    如果观察者在Z轴的正方向,Z值大的靠近观察者
    如果观察者在Z轴的负方向,Z值小的靠近观察者

  • 深度测试的弊端
    在绘制多边形并且开启深度测试时,可能会产生z-stitching和z-fighting。当使用glPolygonMode (GLenum face, GLenum mode)为多边形绘制边界时,由于线和面的光栅化的方式不同,导致位于同一位置的多边形和直线的深度值并不相同,进而导致直线有时在多边形的里面,有时在多边形的外面,这种现象就是"Stiching。
    而Z-fighting主要是指当两个面共面时,二者的深度值一样,深度缓冲就不能清楚的将它们两者分离开来,位于后面的图元上的一些像素就会被渲染到前面的图元上。
    使用glPolygonOffset (GLfloat factor, GLfloat units)可以解决这两个问题。

Xcode demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容