深度缓冲区原理以及为什么要用它
2013-08-19 20:53
225 查看
1.在开始介绍深度缓存之前,先了解一下隐藏表面消除。
隐藏表面消除(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)
否则可能出现画面错误。为什么呢,因为画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可以使用混合函数绘制半透明物体了。
隐藏表面消除(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编程指南-->深度缓冲区原理以及为什么要用它
- 为什么要学习框架以及框架的原理
- 为什么HashSet不能重复以及具体原理源码分析
- OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewF
- 深度理解Android InstantRun原理以及源码分析
- Struts2中为什么要使用拦截器?拦截器的使用原理以及如何配置拦截器。
- 为什么ESP8266 TCP透传过程会丢包?8266流控原理以及如何设置
- DNN深度神经网络 的原理 以及 使用
- 文件系统相关知识 以及根据文件系统原理设计内核缓冲区
- 深度理解Android InstantRun原理以及源码分析
- Google深度揭秘TPU:一文看懂内部原理,以及为何碾压GPU
- 深度链接、延迟深度链接、App Links以及关于LinkedME实现深度链接的原理解析
- 深度理解Android InstantRun原理以及源码分析
- OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewFilter
- hibernate延迟加载lazy的原理,以及为什么session关闭会报错
- 深度理解Android InstantRun原理以及源码分析
- OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewFilter
- OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewFilter
- 深度理解Android InstantRun原理以及源码分析