`
美丽的小岛
  • 浏览: 308586 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

OpenGL 深度缓冲区 Z缓冲区 介绍

 
阅读更多

第一篇

颜色缓冲区

  颜色缓冲区(COLOR_BUFFER)就是帧缓冲区(FRAME_BUFFER),你需要渲染的场景最终每一个像素都要写入该缓冲区,然后由它在渲染到屏幕上显示.

深度缓冲区

  深度缓冲区(DEPTH_BUFFER)与帧缓冲区对应,用于记录上面每个像素的深度值,通过深度缓冲区,我们可以进行深度测试,从而确定像素的遮挡关系,保证渲染正确.

模板缓冲区

  模版缓冲(STENCIL_BUFFER)与深度缓冲大小相同,通过设置模版缓冲每个像素的值,我们可以指定在渲染的时候只渲染某些像素,从而可以达到一些特殊的效果.

 

 

深度缓冲区的作用就是区分颜色所在的层次,防止把被遮挡住的颜色显示出来。

当一个像素第二次被绘制时– 例如当一个物体在另一个物体之后被绘制- 深度缓冲要么保留前面的深度值,要么使用第二个像素的深度值替换当前深度值。那个深度保留哪个深度抛弃取决于你选择的深度函数。例如,如果当前深度函数是CompareFunction.LessEqual时,只有小于等于当前深度值的值才会被保留,而大于当前深度值的值会被抛弃。这叫做深度测试,每次绘制像素时都会进行深度测试。当对一个像素进行深度测试时,它的颜色会被写入渲染目标,而深度被写入深度缓冲

 

 

 

深度缓冲区原理以及为什么要用它

                                                                                                    ----------------参考资料《OpenGL编程指南》

1.在开始介绍深度缓存之前,先了解一下隐藏表面消除。
     隐藏表面消除(hidden-surface removal)就是消除实心物体被其他物体所遮挡的那部分。实现隐藏表面消除最简单方法就是使用深度缓冲区(又叫Z缓冲区)。
2.深度缓冲区原理
    深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。
    首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面)。
    然后,在场景中以任意次序绘制所有物体。硬件或者软件所执行的图形计算把每一个绘制表面转换为窗口上一些像素的集合,此时并不考虑是否被其他物体遮挡。
    其次,OpenGL会计算这些表面和观察平面的距离。如果启用了深度缓冲区,在绘制每个像素之前,OpenGL会把它的深度值和已经存储在这个像素的深度值进行比较。新像素深度值<原先像素深度值,则新像素值会取代原先的;反之,新像素值被遮挡,他颜色值和深度将被丢弃。
    为了启动深度缓冲区,必须先启动它,即glEnable(GL_DEPTH_TEST)。每次绘制场景之前,需要先清除深度缓冲区,即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序绘制场景中的物体。

 

 

 

第二篇

 

 

openGL里常出现深度测试,一直不清楚。今天就来弄清楚。

  (1)什么是深度?

        深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!

   深度值(Z值)越大,则离摄像机越远。

   深度值是存贮在深度缓存里面的,我们用深度缓存的位数来衡量深度缓存的精度。深度缓存位数越高,则精确度越高,目前的显卡一般都可支持16位的Z Buffer,一些高级的显卡已经可以支持32位的Z Buffer,但一般用24位Z Buffer就已经足够了。

  (2)为什么需要深度?

   在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。

        实际上,只要存在深度缓冲区,无论是否启用深度测试,OpenGL在像素被绘制时都会尝试将深度数据写入到缓冲区内,除非调用了glDepthMask(GL_FALSE)来禁止写入。这些深度数据除了用于常规的测试外,还可以有一些有趣的用途,比如绘制阴影等等。

 (2)启用深度测试

     使用 glEnable(GL_DEPTH_TEST);

     在默认情况是将需要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。

     但是可以使用glDepthFunc(func)来对这种默认测试方式进行修改。

     其中参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默认值是GL_LESS。

    一般来将,使用glDepthFunc(GL_LEQUAL);来表达一般物体之间的遮挡关系。 

(3)启用了深度测试,那么这就不适用于同时绘制不透明物体。

 

备注:

绘制半透明物体时,需注意:在绘制半透明物体时前,还需要利用glDepthMask(GL_FALSE)将深度缓冲区设置为只读形式,否则可能出现画面错误。为什么呢,因为画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可以使用混合函数绘制半透明物体了。

分享到:
评论

相关推荐

    OpenGL 深度测试1_VS2015

    深度缓冲区(也称为Z缓冲区)是实现深度测试的核心。每个像素都有一个关联的深度值,表示该像素在3D空间中的距离。当新的像素被绘制时,OpenGL会将其深度值与当前深度缓冲区中的值进行比较。如果新的像素更靠近观察...

    OpenGLES demo - 5. 深度测试

    在绘制3D物体时,每一个片段(fragment)在被写入颜色缓冲区之前,都会经过深度测试,只有通过了测试的片段才会更新颜色缓冲区和深度缓冲区。 在OpenGLES的源码示例中,通常会包含以下步骤: 1. 初始化OpenGL ES上...

    OpenGL深度值+AABB包围盒

    深度缓冲区(Depth Buffer)存储这些深度值,确保了正确的前后覆盖关系,避免了物体穿透或遮挡错误。当一个新的像素被绘制时,OpenGL会比较当前的深度值和深度缓冲区中的值。如果新的深度值更小,表示这个像素更靠近...

    opengl,深度检测自用

    当OpenGL绘制一个像素时,会将当前像素的深度值与深度缓冲区中的已有值进行比较。如果新的像素更靠近观察者(即具有更小的深度值),则会更新深度缓冲区,并绘制这个像素;否则,新的像素将被丢弃,保持原有像素不变...

    手动实现OpenGL部分功能:放缩、旋转、视角、缓冲区等等

    默认情况下,有颜色缓冲区和深度缓冲区。可以使用`glDrawBuffer`和`glReadBuffer`设置读取和绘制颜色缓冲区的方式。多重缓冲技术,如双缓冲,能减少闪烁,提高渲染质量。 6. **手动实现**: 手动实现这些功能意味...

    易语言源码OPENGL中的Z轴应用.rar

    在OpenGL中,Z缓冲区(或深度缓冲区)技术是处理Z轴的关键,它用于解决多边形遮挡问题,确保近处的物体始终覆盖远处的物体,从而提供正确的视觉效果。 易语言是一种以中文为编程语法的编程语言,旨在降低编程门槛,...

    扫描线Z缓冲算法

    它使用一个称为Z缓冲区(或深度缓冲区)的数据结构,该缓冲区与屏幕上的每个像素一一对应,存储了像素位置对应的3D空间中的深度值(即距离观察者的距离)。 算法的基本步骤如下: 1. 初始化:创建一个与屏幕分辨率...

    opengl 源代码

    在OpenGL中,ZBuffer,也被称为深度缓冲区,是图形渲染过程中的一个重要部分。ZBuffer技术用于解决多边形遮挡问题,确保在屏幕上正确地绘制出前景和背景对象。当两个或多边形在同一位置上重叠时,ZBuffer会根据每个...

    OpenGL3.3_ScreenSpaceZbuffer.rar

    深度缓冲工作原理是:当场景中的每个像素被渲染时,它的Z值(即距离观察者的深度)会被存储在帧缓冲区的一个特殊部分——深度缓冲区。当新的像素覆盖旧的像素时,如果新像素的Z值更远,那么旧像素将被丢弃;如果新...

    Z_Buffer缓冲器可见面算法

    Z_Buffer算法的核心思想就是在每个像素位置维护一个Z缓冲区(也称为深度缓冲区),存储像素的Z值。当一个新的像素被绘制时,会与Z缓冲区中当前的Z值进行比较。如果新的像素更靠近观察者(Z值较小),则更新该位置的...

    opengl拾取例子

    首先,OpenGL拾取的基本原理是利用深度缓冲区(Depth Buffer)和颜色缓冲区(Color Buffer)的信息来确定鼠标点击位置对应的3D空间中的物体。当用户在屏幕上点击一个位置时,我们需要将这个2D坐标转换为3D世界坐标,...

    OpenGL基础图形编程_opengl_

    OpenGL的编程流程通常包括初始化OpenGL上下文、加载着色器程序、设置模型视图投影矩阵、绘制图元、执行着色器计算、清除颜色缓冲区和深度缓冲区,最后将结果呈现到屏幕上。随着技术的发展,现代OpenGL更强调程序员...

    opengl_wind.7z

    2. 清除颜色缓冲区和深度缓冲区,为新的帧做准备。 3. 使用OpenGL函数绘制图形,包括顶点、颜色、纹理等信息。 4. 调用`glSwapBuffers()`,将后缓冲区的内容交换到前缓冲区,即显示在屏幕上。 5. 重复以上步骤,直到...

    opengl 消隐算法

    该算法使用一个额外的缓冲区(即Z-Buffer或深度缓冲区),存储每个像素对应位置的深度值。当绘制一个新的像素时,OpenGL会比较当前像素的深度值与Z-Buffer中的值,如果新的像素更接近观察者,则更新Z-Buffer并绘制该...

    利用OpenGL进行CAD三维图形消隐处理.rar_OpenGL CAD_opengl_三维 消隐_消隐

    1. Z-Buffer法:OpenGL提供了一个硬件支持的深度缓冲区,每个像素都有一个对应的深度值。在绘制物体时,OpenGL会计算每个像素的深度,并与当前深度缓冲区中的值进行比较。如果新的像素更靠近观察者,则更新深度值并...

    OPENGL中的Z轴应用.zip易语言项目例子源码下载

    1. **深度缓冲区(Depth Buffer)**:在OpenGL中,Z轴的主要作用体现在深度测试上,通过深度缓冲区来确保正确地绘制具有前后关系的3D物体。每个像素都有一个与之关联的深度值,表示该像素对应的3D点距离观察者有多远...

    InteriorRedactor:Qt编写的(C ++)多线程跨平台内部编辑器和查看器,支持使用自己的obj模型。 不需要OpenGL或DirectX库。 使用z缓冲区(深度缓冲区)和Gouraud阴影算法绘制

    场景使用z缓冲区(深度缓冲区)算法和Gouraud阴影进行绘制。 包含许多obj模型,但是如果要使用自己的obj模型,请将其放入/ models中的任何文件夹中(可以创建文件夹)。 与任何版本的Qt5.x库兼容的源。 您可以在/...

    Depth-Test--Example.rar_opengl depth_visual c_风车 openGL

    3. 清空深度缓冲区:在每次绘制之前,通常会调用`glClear(GL_DEPTH_BUFFER_BIT)`清空深度缓冲区,确保开始时所有像素的深度值都是最小值。 C++6.0作为编程环境,提供了编写OpenGL应用程序的基础框架。开发者可以...

    OpenGL.zip_C#OPENGL_c# opengl_opengl_visual c

    10. **缓冲区和帧缓冲区**:OpenGL支持多种类型的缓冲区,如顶点缓冲区、颜色缓冲区、深度缓冲区等,用于存储数据和提高性能。 11. **错误检查**:OpenGL函数返回值通常是无错误信息的,因此需要使用glGetError函数...

    opengl三维logo

    6. **深度测试**:为了避免物体间的重叠遮挡问题,OpenGL提供深度缓冲区,通过`glEnable(GL_DEPTH_TEST)`启用,确保近处的物体覆盖远处的物体。 7. **绘制循环**:在主循环中,通过`glClear()`清除屏幕和深度缓冲区...

Global site tag (gtag.js) - Google Analytics