美文网首页
隐藏⾯消除的解决方案【渲染技巧】

隐藏⾯消除的解决方案【渲染技巧】

作者: buding_ | 来源:发表于2022-12-20 16:26 被阅读0次

在绘制3D场景时,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的。对于不可见的部分,应该及早丢弃。例如在一个不透明的墙壁后,就不应该渲染,这种情况就叫做“隐藏面消除”。

方案一:油画算法

先绘制场景中距离观察者远的物体,再绘制近的物体
弊端: 无法处理叠加的情况

方案二:正背面剔除(face culling)

OpenGL可以做到检查所有正面朝向观察者的面,并渲染它们。从而丢弃背面朝向的面,这样可以节约片元着色器的性能。


分析顶点顺序判断正反面.png
开启表面剔除
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 逆时针

方案三:深度缓冲区

什么是深度?
深度就是该像素点在3D世界中距离摄像机的距离 z值。 距离越远,z值越大

什么是深度缓冲区?
深度缓冲区,就是一块内存区域,专门存储着每个像素点深度值

为什么需要深度缓冲区?
有了深度缓冲区后,可以避免先绘制距离近的物体,再绘制距离远的物体导致近的物体被覆盖的情况; 让绘制物体的顺序就不那么重要的。

深度缓冲区和颜色缓冲区是对应的,颜色缓冲区存储着像素的颜色信息,而深度缓冲区存储着像素的深度信息。
在决定是否绘制一个物体表面时,首先要将表面对应的像素的深度值与当前深度缓冲区的值进行比较。如果大于深度缓冲区中的值,则丢弃这部分;否则使用这个像素对应的深度值和颜色值,分别更新到深度缓冲区和颜色缓冲区,这个过程叫做 “深度测试”。

相关文章

网友评论

      本文标题:隐藏⾯消除的解决方案【渲染技巧】

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