OpenGL下隐藏面消除的解决方案

在OpenGL的渲染下,我们需要决定哪些部分是对观察者可见的,或者哪些部分不可见。对于不可见的部分我们需要进行一定的处理,不然就会出现以下情况。

所以我们给出以下方案:

1、油画算法:先绘制距离观察者远的物体(图片1),再绘制距离距离观察者近的物体(图片2)。如下图所示。

但是此方法存在一个弊端,如果图片的叠加是无序且错综复杂的,在绘制时就无法明确出正确的先后顺序!,如下图所示:

由此我们得到方法2。

2、正背面剔除

OpenGL 可以做到检查所有的正面朝向观察者的面,并且渲染它们,从而丢弃背面,可以解决片元着色器的性能。因此我们需要通过分析顶点数据的顺序来区分图形的正面和背面。

正面:按照逆时针顶点顺序连接的三角形面

背面:按照顺时针顶点顺序连接的三角形面

OpenGL方法:

• 开启表面剔除(默认为背面剔除)

void glEnable(GL_CULL_FACE);

• 关闭表面提出(默认背面剔除)

void glDisable(GL_CULL_Face);

• 用户选择剔除哪个面

void glCullFace(GLenum mode);

model参数:GL_FRONT,GL_BACK,GL_FRONT_AND_BACK ,默认GL_BACK⽤用户指           
定绕序那个为正⾯面    

使用正背面剔除后效果如下所示:

由上图可看出,我们已经解决了隐藏面导致显示异常的问题,但是我们出现了如上图的问题,这个效果是由于深度引起的相关显示问题。

1、什么是深度?

深度是指该像素点在3D世界中距离摄像机位置的Z值。

2、什么是深度缓冲区

深度缓冲区是指一块内存区域,专门用来保存每个像素点在屏幕上的深度值。深度越大Z值越大。

3、深度缓冲区的意义

在不使用深度测试的时候,假如我们先绘制一个近距离的物体,在绘制一个远距离的物体,远距离物体因为后绘制,就会把近距离的物体覆盖掉,有了深度缓冲区,物体绘制的顺序就不那么重要了,实际上只要存在深度缓冲区,OpenGL都会把像素的深度值写入其中,除非掉用glDepthMask(GL FALSE)来禁止写入。

所以在我们开启深度测试的时候,首先要将表面对应的像素的深入值和当前深度缓冲区中的值进行比较,如果大于深入缓冲区中的值,则丢弃这部分,否者就利用该像素对应的深度值和颜色值分别更新深度缓冲区和颜色缓冲区。这个过程就是深度测试。(深入缓冲区和颜色缓冲区是一一对应的)。深入测试的判断是以像素点为单位,并非以当前绘制的图形为单位。

4、如何开启深度测试?

glEnable(GL_DEPTH_TEST).

在使用中我们需要注意如果项目中需要使用深度测试,我们在绘制前要对深度缓冲区进行清除。如果不清空颜色/深度缓冲区时,会造成数据的残留,导致绘制异常。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

开启深入测试后的效果图如下图所示:

但是在一些复杂场景中会出现遇到深度值都一样的情况,这样就会出现ZFighting 闪烁问题。

ZFighting 闪烁:即指OpenGL不能正确的判断同一平面的绘制的深度值,导致深入测试结果不可预测,显示出来的纹理交错闪烁),就需要进行如下处理多边形偏移让其深度值产生一些细微的变化,达到区分二者图形深度值的效果。 指定偏移量

void glPolygonOffet(Glfloat factor,Glfloat units);

一般来说,只需要将-1.0和-1这样简单赋值给glPolygonOffet基本就可以满足需求。这样我们就可以绘制出更逼真的场景了。

作者:林子的蜕变路
链接:https://juejin.cn/post/6896834505244409869

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL(Graphics Library,GL图形库)图形系统是图形硬件的一个软件接口,它允许我们创建交互性的程序,产生移动三维物体的彩色图像。使用OpenGL,我们可以对计算机图形技术进行控制,产生逼真的图像或者虚构出现实世界没有的图像。本书解释了如何使用OpenGL图形系统进行编程,实现所需要的视觉效果。   本书内容   本书共分15章。前5章描述了一些基本信息,读者需要理解这些内容,才能在场景中绘制正确着色和光照的三维物体。   ·第1章对OpenGL可以实现的功能进行简要的介绍。该章还提供了一个简单的OpenGL程序,并介绍需要了解的一些基本编程细节,有助于学习后续章节的内容。   ·第2章解释如何创建一个物体的三维几何图形描述,并最终把它绘制到屏幕上。   ·第3章描述三维模型在绘制到二维屏幕之前如何进行变换。我们可以控制这些变换,显示模型的特定视图。   ·第4章描述如何指定颜色以及用于绘制物体的着色方法。   ·第5章解释如何控制围绕一个物体的光照条件,以及这个物体如何对光照作出反应(也就是说,它是如何反射或吸收光线的)。光照是一个重要的主题,因为物体在没有光照的情况下看上去往往没有立体感。   接下来的几章说明如何对三维场景进行优化以及如何添加一些高级特性。在没有精通OpenGL之前,读者可以选择不使用这些高级特性。有些特别高级的主题在出现时会有特殊的标记。   ·第6章描述创建逼真场景所需要的一些基本技巧:alpha混合(创建透明物体)、抗锯齿(消除锯齿状边缘)、大气效果(模拟雾和烟雾)以及多边形偏移(在着重显示填充多边形的边框时消除不良视觉效果)。   ·第7章讨论如何存储一系列的OpenGL命令,用于在以后执行。我们可以使用这个特性来提高OpenGL程序的性能。   ·第8章讨论如何操作表示位图或图像的二维数据。位图的一种常见用途就是描述字体中的字符。   ·第9章解释如何把称为纹理的一维、二维和三维图像映射到三维物体表。纹理贴图可以实现许多非常精彩的效果。   ·第10章描述OpenGL实现中可能存在的所有缓冲区,并解释如何对它们进行控制。我们可以使用这些缓冲区实现诸如隐藏消除、模板、屏蔽、运动模糊和景深聚焦等效果。   ·第11章显示了如何使用GLU(OpenGL Utility Library,OpenGL工具函数库)中的分格化和二次方程函数。   ·第12章介绍生成曲线和表的高级技巧。   ·第13章说明如何使用OpenGL的选择机制来选择屏幕上的一个物体。此外,该章还解释了反馈机制,它允许我们收集OpenGL所产生的绘图信息,而不是在屏幕上绘制物体。   ·第14章描述如何用巧妙的或意想不到的方法来使用OpenGL,产生一些有趣的结果。这些技巧是通过对OpenGL及其技术前驱Silicon Graphics IRIS图形函数库的多年应用和实践总结出来的。   ·第15章讨论OpenGL 2.0所引入的变化,包括对OpenGL着色语言的介绍。OpenGL着色语言通常又称为GLSL,它允许对OpenGL的顶点和片断处理阶段进行控制。这个特性可以极大地提高图像的质量,充分体现OpenGL的计算威力。   另外,本书还包括几个非常实用的附录:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值