二、OpenGL - 渲染技巧

2020-07-09  本文已影响0人  恍然如梦_b700

1. 正背面剔除

1.在绘制3D场景的时候,我们需要决定哪些部分是对观察者可⻅的,或者哪些部分是不可见的。对于不可⻅的部分,应该及早丢弃,这种做法叫做隐藏⾯消除(Hide surface elimination)。

但是如果出现类似下图三个视图叠加的情况,那么油画算法就无法处理了


image.png

在OpenGL中,正背面的规定如下:

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

未开启正背面剔除的效果如下图


image.png

开启之后的效果:


image.png

这个坑是又是什么鬼?不是已经剔除背面了吗?别急,接着往下看

2.深度

glEnable(GL_DEPTH_TEST); 

在绘制场景前,清除颜⾊缓存区,深度缓冲

glClearColor(0.0f,0.0f,0.0f,1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

清除深度缓冲区默认值为1.0,表示最⼤的深度值,深度值的范围为(0,1)之间. 值越⼩表示越靠近观察者,值越⼤表示越远离观察者

void glDepthFunc(GLEnum mode);
image.png

3. ZFighting闪烁

image.png

开启深度测试后,OpenGL 就不会再去绘制模型被遮挡的部分. 这样实现的显示更加真实.但是
由于深度缓冲区精度的限制对于深度相差⾮常⼩的情况下.(例如在同⼀平⾯上进⾏2次绘制),OpenGL 就可能出现不能正确判断两者的深度值,会导致深度测试的结果不可预测.显示出来的现象时交错闪烁.的前⾯2个画⾯,交错出现.

如何解决ZFighting闪烁呢?

//启⽤Polygon Offset ⽅式
glEnable(GL_POLYGON_OFFSET_FILL) 
参数列表: 
GL_POLYGON_OFFSET_POINT 对应光栅化模式: GL_POINT 
GL_POLYGON_OFFSET_LINE 对应光栅化模式: GL_LINE 
GL_POLYGON_OFFSET_FILL 对应光栅化模式: GL_FILL
glDisable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_POLYGON_OFFSET_FILL)
ZFighting预防
上一篇 下一篇

猜你喜欢

热点阅读