深度缓冲区原理以及为什么要用它
来源:互联网 发布:连接网络将服务器 编辑:程序博客网 时间:2024/04/28 06:23
1.在开始介绍深度缓存之前,先了解一下隐藏表面消除。
隐藏表面消除(hidden-surface removal)就是消除实心物体被其他物体所遮挡的那部分。实现隐藏表面消除最简单方法就是使用深度缓冲区(又叫Z缓冲区)。
2.深度缓冲区原理
深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。
首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面)。
接着,在场景中以任意次序绘制所有物体。硬件或者软件所执行的图形计算把每一个绘制表面转换为窗口上一些像素的集合,此时并不考虑是否被其他物体遮挡。
隐藏表面消除(hidden-surface removal)就是消除实心物体被其他物体所遮挡的那部分。实现隐藏表面消除最简单方法就是使用深度缓冲区(又叫Z缓冲区)。
2.深度缓冲区原理
深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。
首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面)。
接着,在场景中以任意次序绘制所有物体。硬件或者软件所执行的图形计算把每一个绘制表面转换为窗口上一些像素的集合,此时并不考虑是否被其他物体遮挡。
其次,OpenGL会计算这些表面和观察平面的距离。如果启用了深度缓冲区,在绘制每个像素之前,OpenGL会把它的深度值和已经存储在这个像素的深度值进行比较。新像素深度值<原先像素深度值,则新像素值会取代原先的;反之,新像素值被遮挡,他颜色值和深度将被丢弃。
为了启动深度缓冲区,必须先启动它,即glEnable(GL_DEPTH_TEST)。每次绘制场景之前,需要先清除深度缓冲区,即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序绘制场景中的物体。
备注:
绘制半透明物体时,需注意:在绘制半透明物体时前,还需要利用glDepthMask(GL_FALSE)将深度缓冲区设置为只读形式,或者使用glDisable(GL_DEPTH_TEST) 否则可能出现画面错误。为什么呢,因为画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可以使用混合函数绘制半透明物体了。
- 深度缓冲区原理以及为什么要用它
- OpenGL编程指南-->深度缓冲区原理以及为什么要用它
- OpenGL编程指南-->深度缓冲区原理以及为什么要用它
- Class.forName的作用以及为什么要用它
- Class.forName的作用以及为什么要用它【转】
- Class.forName的作用以及为什么要用它
- Class.forName的作用以及为什么要用它
- Class.forName的作用以及为什么要用它【转】
- Class.forName的作用以及为什么要用它【转】
- 什么是Ubuntu PPA以及为什么要用它[技术说明]
- Class.forName的作用以及为什么要用它【转】
- Class.forName的作用以及为什么要用它
- Class.forName的作用以及为什么要用它【转】
- Class.forName的作用以及为什么要用它【转】
- Class.forName的作用以及为什么要用它【转】
- <转>Class.forName的作用以及为什么要用它
- Class.forName的作用以及为什么要用它【转】
- Class.forName的作用以及为什么要用它
- UVa:615 Is It A Tree?
- 虚拟机启动报错Unable to open kernel device "\\.\VMCIDev\VMX"
- Linux LCD驅動架構學習(二)
- zoj 1284||poj 1528||hdu 1323(筛选法求因子和)
- Dijkstra算法模板
- 深度缓冲区原理以及为什么要用它
- BNU The Twin Towers
- 二叉树遍历,已知前序遍历与中序遍历,求后续遍历 使用java(递归方式)实现
- jquery 获得keycode
- Linux基本操作 4----- Linux系统目录架构
- 网络
- 白书的一些题目
- 庞果网---回文字符串
- Qt 编码惯例