OpenGL 正背面剔除和深度测试的理解

2020-07-09  本文已影响0人  iOS_沧海一笑

正背面剔除的理解和解决方案:

QQ20200709-141648-HD.gif

问题:为什么会产生像图片那样的问题,会出现一大坨黑色的,我明明只是渲染的红色的,黑色的是怎么来的?带着这个问题我们往下看...

对于这个问题,我们先来看有几种解决方案:

通过上面的分析,油画算法不能处理叠加的情况,那我们接下来就研究一下正背面剔除(Face Culling)

正背面区分

分析立方体中的正背面

  1. 开启表面剔除(默认背面剔除) void glEnable(GL_CULL_FACE);
  2. 关闭表面剔除(默认背面剔除) void glDisable(GL_CULL_FACE);
  3. ⽤户选择剔除那个面(正面/背面) void glCullFace(GLenum mode);
    mode参数为:GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默认GL_BACK
  4. ⽤户指定绕序那个为正面 void glFrontFace(GLenum mode); mode参数为: GL_CW,GL_CCW,默认值:GL_CCW
  5. 例如,剔除正面实现(1) glCullFace(GL_BACK); glFrontFace(GL_CW);
  6. 例如,剔除正面实现(2) glCullFace(GL_FRONT);

深度测试

  1. 什么是深度?
    深度其实就是该像素点在3D世界中距离摄像机的距离,Z值.
  2. 什么是深度缓冲区?
    深度缓存区,就是一块内存区域,专门存储着每个像素点(绘制在屏幕上的)深度值.深度值(Z值)越大, 则离摄像机就越远.
  3. 为什么需要深度缓冲区?
    在不使⽤深度测试的时候,如果我们先绘制一个距离比较近的物体,再绘制距离较远的物体,则距离远的位图因为后绘制,会把距离近的物体覆盖掉. 有了深度缓冲区后,绘制物体的顺序就不那么􏰀重要的. 实际上,只要存在深度缓冲区,OpenGL 都会把像素的深度值写入到缓冲区中. 除非调用 glDepthMask(GL_FALSE)来禁止写入.
上一篇 下一篇

猜你喜欢

热点阅读