正背面剔除和深度测试

一、正常渲染会出现的问题

默认情况下,OpenGL 将逆时针⽅向环绕绘制的的三角形定义为正⾯,反之为背面。当我们需要渲染一个图案到屏幕上时,图案中的每个点、线或三角形都会在屏幕上进行光栅化,并按照图元装配时的顺序进行排列。

如上图,当我们绘制一个由多个三角形组成的复杂图形时,由于每个三角形都有自己的绘制顺序(正背面之分),所以移动图案时就会出现部分背面的三角形会显示出来,也就是图中黑色部分。那么如何解决这一问题呢:

二、正背面剔除

油画算法:绘制遵循严格的先后顺序,先远后近,近处的图案会把远处的不应展示的部分进行遮盖以解决这一问题。虽然看似完美但也会有其他问题,当我们绘制一个互相层叠覆盖的图案时,由于没有严格的先后顺序,计算机只能进行多次绘制,但是多次绘制自然也会导致性能的浪费

正背面剔除:通过图元装配阶段的方向进而区分正背面,背面的直接被抛弃不渲染,自然就可以解决上述问题了(省略背面渲染流程还可以起到节省性能消耗的作用)。

开启背面剔除:glEnable(GL_CULL_FACE);

关闭背面剔除:glDisable(GL_CULL_FACE);

虽然剔除了不应显示的背面,修复了黑色的问题,但如果旋转图案我们会发现如上情况(两个正面同时存在,电脑无法区分应使用哪个,最终导致错抛的情况)。继续解决问题,请看下文:

三、深度测试

深度:OpenGL坐标系中像素点的Z坐标距离观察者的距离。观察者可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近观察者。(如果观察者在Z轴的正方向,Z值大的靠近观察者,如果是在Z轴的反方向,则Z值小的更靠近观察者。)

深度缓冲区(DepthBuffer):深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。

首先使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值。

启用了深度缓冲区,在绘制每个像素之前OpenGL都会把它的深度值和已经存储在这个像素的深度值进行比较。如果新像素深度值<原先像素深度值,则新像素值会取代原先的像素值;反之新像素的颜色值和深度将被丢弃。这个比较丢弃的过程就叫做深度测试,深度测试是另一种高效消除隐藏面的技术。

申请颜色和深度缓冲区:

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);

启用深度测试:glEnable(GL_DEPTH_TEST);

关闭深度测试:glDisable(GL_DEPTH_TEST);

注意:如果没有深度缓冲区,那么启动深度测试的命令将被忽略。在绘制场景前,清除颜色缓冲区和深度缓冲区:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

理想结果

四、z-fighting(z冲突、闪烁)问题

当深度值精确度较低,像素点所处深度距离较接近,界面前后图案交替显示的情况。

那么如何解决这一问题呢:

1、插入偏移量(第二个像素点绘制时深度增加偏移量与之前深度形成较大区分)

2、使用 glPolygonOffset 函数调节片段的深度值

3、硬件层面解决,采用更高性能设备以使用更高位的深度缓存区使精确度得到提高(通常使用的深度缓冲区是24位的,现在有一些硬件使用32位的缓冲区)

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