OpenGL-消除隐藏面之深度测试

首先直观的感受下,在不消除隐藏面的情况下,图形旋转中会出现的场景:
正背面不消除问题图片

针对上述问题,提供两种解决方法:

1、正背面消除:根据顶点数据顺序判断用户可见部分(阳面)与隐藏面(阴面),隐藏面直接丢弃,不绘制,只绘制可见部分
2、深度测试:不管图层数量,只显示绘制可见图层,剩余不可见的直接丢弃

正背面消除:该方法不能从根本上解决上述场景的问题,会出现缺口,如下图;
缺口问题

上述场景出现的原因:甜甜圈旋转过程中,当前后两部分重叠时,OpenGL中并不能清楚地区分,两个图层谁显示在前,谁显示在后,导致甜甜圈产生了缺口。
关于正背面消除方法具体实现原理,这里不详细阐述(主要需了解下阳面,阴面的判定)

针对正背面消除方法存在的缺陷,深度测试应运而生,首先理解下以下几个概念

深度:指OpenGL坐标系中,像素点的Z坐标距观察者的距离,存在如下关系:

1、如果观察者在Z轴的正方向,Z值越大则越靠近观察者
2、如果观察者在Z轴的负方向,Z值越小则越靠近观察者

图解如下:
深度值与Z坐标值的关系(基于 观察者不动,物体动的观察方式)

深度缓存区(Depth Buffer):

指一块专门内存区域,存储在显存中,用于存储屏幕上所绘制图形的每个像素点的深度值,对应关系如下:
1、深度值越大,离观察者越远
2、深度值越小,里观察者越近
注意事项:
1、深度缓存区中,每个像素点和深度值一一对应
2、深度缓冲区的范围是[0, 1]之间,默认值是1.0,表示深度值的最大值
3、每次绘制前需清空深度缓存区,否则会存在上次绘制缓存的深度值,影响当前图形的绘制

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

深度测试:

一个物体在绘制时,像素点新的深度值与深度缓存中已经存在的深度值作比较,若新值 > 旧值,则丢弃,反之,将新的深度值更新至深度缓存区,由于深度缓存区与颜色缓存区是一一对应的,同时也需要更新该像素点的颜色值到颜色缓存区,该过程就是深度测试
开启深度测试

glEnable(GL_DEPTH_TEST);

关闭深度测试

glDisable(GL_DEPTH_TEST);

开启深度测试后,效果图如下:
开启深度测试后效果图

多边形偏移(Polygon Offset)

深度测试虽然解决了上述出现的缺口问题,但同时引出了Z-Fighting(Z冲突,闪烁)问题,发生z冲突的原因如下:开启深度测试后,由于深度缓冲区精度限制,导致深度值在误差极小时,OpenGL出现无法判断的情况,出现画面交错闪现的现象,举例如下:
Z冲突剧烈

开启深度测试

glEnable(GL_POLYGON_OFFSET_FILL)

关闭深度测试

glDisable(GL_POLYGON_OFFSET_FILL)

预防解决Z冲突方法:

1、避免两个物体靠的太近:在绘制时,插入一个小偏移
指定偏移量glPolygonOffset (GLfloat factor, GLfloat units),参数一般填 -1 和 -1
2、将近裁剪面(设置透视投影时设置)设置的离观察者远一些:提高裁剪范围内的精确度
2、使用更高位数的深度缓冲区:提高深度缓冲区的精确度

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