首先咱们看下面的一个圆环gif图的例子,咱们从中能够发现,bash
圆圈正面是红色,底部边缘是黑色的光芒,当咱们移动圆圈的时候,若是正面跟背面(正面是初始化时相对于观察者看到的页面)均显示在观察者前面时候会显示出黑色的背景,这样的效果明显不是咱们想要的效果,咱们想要的是不管怎么移动圆环,咱们看到的都是红色,那么咱们该如何解决这个问题呢?所以咱们使用正背面剔除以及深度测试来解决。markdown
从一个3D图形中咱们最多能够看到三个面,其他的面咱们是没法看到,所以在绘制3D图形的时候咱们能够仅绘制看到的面,那些看不到的OpenGL不进行渲染则会提高超过50%的性能。性能
对于固定的角度看3D图形而言测试
所以当从不一样角度观看3D图形时,正面背面有可能发生变换,如图spa
当观察者左侧看,左边三角形123是逆时针则是正面,右边三角形123是顺时针则是背面,code
当观察者在右侧看,左边三角形123是顺时针是背面,右边三角形123是逆时针则是正面,orm
总结:正面背面是根据观察者以及组成三角形的顶点定义顺序决定的内存
//开启背面剔除
glEnable(GL_CULL_FACE);
//下面两行代码能够不写,此处只是为了展现如何写
//设置哪儿是正面(使用默认就行)
glFrontFace(GL_CCW);
//剔除背面(默认就是剔除背面的)
glCullFace(GL_BACK);
复制代码
glDisable(GL_CULL_FACE);
复制代码
咱们从上面背面剔除的gif图中发现圆环缺失了一部分,缺失的时候刚好圆环的两部重叠了,那么这个如何造成的呢?下面咱们引出深度测试的概念。it
深度就是3D图形中像素点距离观察者的距离,即Z值,注意的是z值是个非负数io
深度换冲区就是一块专门存储像素点深度值的内存区域,深度值越大距离观察者越远。
那么为何须要深度缓冲区呢?
在不开启深度测试的时候,咱们绘制3D图形都是先绘制距离比较近的物理,而后再绘制距离远的物理,所以距离较远物理就有可能把距离较近的物理给覆盖住,若是咱们使用深度缓冲区则无需担忧覆盖的问题,由于每一个像素点的深度都会写入深度缓冲区。
深度缓冲区跟颜色缓冲区是相对应的,颜色缓冲区存储像素的色值信息,当绘制一个物理的时候,会比较将要绘制的深度值跟当前的深度值的大小,若是大于当前的深度值,则该顶点绘制废弃掉,这就是深度测试。
glEnable(GL_DEPTH_TEST);
复制代码
glDisable(GL_DEPTH_TEST);
复制代码
当咱们开启深度测试的时候,虽然被遮挡的部分(背面)再也不进行绘制,可是当两个顶点的深度值相同时,OpenGL就不能识别出来哪一个绘制哪一个放弃了,所以会出现交错显示的画面,以下面两画面交错闪烁展现
那么如何解决这个问题呢?
第一步,启⽤用 Polygon Offset ⽅方式解决 ,让深度值之间产生间隔
//启⽤用Polygon Offset ⽅方式
glEnable(GL_POLYGON_OFFSET_FILL);
复制代码
glPolygonOffset(-1,1);复制代码
glDisable(GL_POLYGON_OFFSET_FILL);
复制代码