美文网首页
OpenGL -- 正背面剔除、深度测试、多边形偏移、混合

OpenGL -- 正背面剔除、深度测试、多边形偏移、混合

作者: 木扬音 | 来源:发表于2021-09-09 18:41 被阅读0次

正背面剔除

在绘制3D场景时,我们需要决定哪些部分相对于观察者是可见的、不可见。对于不可见的部分应该及早丢弃,不进行渲染。这种情况就叫影藏面消除

image.png

正⾯和背⾯是有三⻆形的顶点定义顺序和观察者⽅向共同决定的.随着观察者的⻆度⽅向的改变,正⾯背⾯也会跟着改变。

  • 正面:按照逆时针顶点连接顺序的三角形面
  • 背面:按照顺时针顶点连接顺序的三角形面
//开启正背面剔除
glEnable(GL_CULL_FACE);
//关闭正背面剔除
glDisable(GL_CULL_FACE);
//选择剔除那个面
mode参数为: GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默认GL_BACK
glCullFace(GLenum mode); 
//指定那个绕序为正面
glFrontFace(GLenum mode); 
mode参数为: GL_CW,GL_CCW,默认值:GL_CCW(逆时针)
//剔除正⾯实现(1) 
glCullFace(GL_BACK); 
glFrontFace(GL_CW); 
//剔除正⾯实现(2) 
glCullFace(GL_FRONT);

深度测试

  • 什么是深度
    深度是该像素点在3D世界中距离摄像机的距离,即Z值
  • 什么是深度缓存区
    是一块专门的内存区域,存储每个像素点的深度值(Z值),范围是0.0--1.0之间
    • 如果观察者在Z轴的方向,Z值越大则靠近观察者
    • 如果观察者在Z轴的方向,Z值越小则靠近观察者
  • 什么是深度测试
    深度缓冲区和颜色缓冲区是一一对应的,颜色缓冲区存储像素的颜色信息,深度缓冲区存储深度信息,在决定是否绘制一个物体的表面时,首先要将物体对应的像素深度值与当前深度缓冲区中的深度值进行比较,如果大于深度缓冲区中的值,则这部分丢弃,反之则使用该像素对应的颜色值和深度值,再分别更新深度缓冲区和颜色缓冲区。这个过程就是深度测试
//开启深度测试
glEnable(GL_DEPTH_TEST);
//绘制场景前,需要清除颜色缓冲区、深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

ZFighting闪烁问题

因为在开启深度测试后,由于深度缓冲区精度的限制,OpenGL就可能出现不能正确判断两者的深度值大小,会导致深度测试的结果不可预测,显示出来的图像交错闪烁


ZFighting闪烁
多边形偏移方案
  • 绘制前,开启多边形偏移
//        多边形偏移枚举值            对应的图像填充模式
//    GL_POLYGON_OFFSET_POINT         GL_POINT
//    GL_POLYGON_OFFSET_LINE          GL_LINE
//    GL_POLYGON_OFFSET_FILL          GL_FILL

glEnable(GL_POLYGON_OFFSET_FILL);
  • 指定偏移量
//一般填写-1和-1

glPolygonOffset (GLfloat factor, GLfloat units);
  • 在绘制完成后,关闭多边形偏移
glDisable(GL_POLYGON_OFFSET_FILL)

混合

在开启深度测试后,当有两个图层进行叠加,如果一个图层是半透明,一个是不透明的,此时就不能通过深度值进行比较,来进行颜色值覆盖。而是需要将两个颜色进行复合,然后存入颜色缓冲区

使用方式

  • 直接使用开关方式
    用于单纯的将两个图层重叠时进行颜色混合,这种混合并不能解决颜色的混合。在固定着色器可编程着色器都可以使用
//开启,
glEnable(GL_BlEND);
//关闭
glDisable(GL_BlEND);
  • 开关 + 混合方程式
    该方式用于处理类似滤镜之类的效果,就是不再是纯粹的叠加,而是需要进行两个颜色的混合。一般在可编程着色器中的片元着色器中使用
//开启,
glEnable(GL_BlEND);
//设置混合因子--默认值是 GL_SRC_ALPHA 和 GL_ONE_MINUS_SRC_ALPHA
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//关闭
glDisable(GL_BlEND);

glBlendFunc方法中,是通过混合方程式来得到颜色的组合,默认情况下混合方程式如下所示。源颜色的alpha值越高,添加的新颜色成分就越高,旧颜色值保留得越少

  • 颜色缓冲区中,每个像素点只能存储一种颜色
  • 颜色混合主要用于实现在不透明物体前绘制透明物体的效果
  • 只有最顶层图层是透明时,才需要开启颜色混合,反之不需要
//Cf -- 最终组合的颜色值
//Cd:源颜色 -- 当前渲染命令传入的颜色值
//CS:目标颜色 -- 颜色缓冲区中已经存在的颜色值
//S:源混合因子
//D:目标混合因子 
Cf = (Cs * S) + (Cd * D)
混合因子

相关文章

网友评论

      本文标题:OpenGL -- 正背面剔除、深度测试、多边形偏移、混合

      本文链接:https://www.haomeiwen.com/subject/vmrfwltx.html