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

2021-09-09  本文已影响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);

深度测试

//开启深度测试
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)
混合因子
上一篇 下一篇

猜你喜欢

热点阅读