OpenGL深度缓存区、深度测试及alpha blend

来源:互联网 发布:java字节码 编辑:程序博客网 时间:2024/04/29 10:38

1. OpenGL深度缓存区、深度测试及alpha blend

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

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

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

 

深度缓冲区

深度缓冲区原理就是把一个距离观察平面(近裁剪面)的深度值(或距离)与窗口中的每个像素相关联。

1> 首先使用glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)来打开DEPTH_BUFFER

void glutInitDisplayMode(unsigned int mode);

2>  每帧开始绘制时,须清空深度缓存 glClear(GL_DEPTH_BUFFER_BIT); 该函数把所有像素的深度值设置为最大值(一般是远裁剪面)

3> 必要时调用glDepthMask(GL_FALSE)来禁止对深度缓冲区的写入。绘制完后在调用glDepthMask(GL_TRUE)打开DEPTH_BUFFER的读写(否则物体有可能显示不出来)

     注意:只要存在深度缓冲区,无论是否启用深度测试(GL_DEPTH_TEST),OpenGL在像素被绘制时都会尝试将深度数据写入到缓冲区内,除非调用了glDepthMask(GL_FALSE)来禁止写入。

 

深度测试

    OpenGL中的深度测试是采用深度缓存器算法,消除场景中的不可见面。在默认情况下,深度缓存中深度值的范围在0.01.0之间

1> 使用glEnable(GL_DEPTH_TEST)打开深度测试

2> 每次绘制场景之前,需要先清除深度缓冲区,即glClear(GL_DEPTH_BUFFER_BIT),然后以任意次序绘制场景中的物体

3> glDepthRange (nearNormDepth, farNormalDepth);指定深度值范围

这里nearNormDepthfarNormalDepth可以取0.01.0范围内的任意值,甚至可以让nearNormDepth > farNormalDepth。这样,通过glDepthRange函数可以在透视投影有限观察空间中的任意区域进行深度测试。

4> glClearDepth (maxDepth);

参数maxDepth可以是0.01.0范围内的任意值。glClearDepthmaxDepth对深度缓存进行初始化,而默认情况下,深度缓存用1.0进行初始化。由于在进行深度测试中,大于深度缓存初始值的多边形都不会被绘制,因此glClearDepth函数可以用来加速深度测试处理。这里需要注意的是指定了深度缓存的初始化值之后,应调用:glClear(GL_DEPTH_BUFFER_BIT);   完成深度缓存的初始化。

5> glDepthFunc(func);

该函数用于指定将需要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较的函数,如果比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。

参数func的值可以为GL_NEVER(没有处理)、GL_ALWAYS(处理所有)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默认值是GL_LESS。这些测试可以在各种应用中减少深度缓存处理的的计算。

启动深度测试后,后面物体的绘制与前后关系就无关了,最后完成绘制后已经自动按照前后顺序显示了。

但是在绘制半透明物体时,深度测试就会出错,你会发现最后绘制结果和想象中的不一样。此时要用到glDepthMaskalpha blend。绘制前调用glDepthMask(GL_FALSE)(或者glDisable(GL_DEPTH_TEST),打开alpha blend,绘制完后在glDepthMask(GL_TRUE)

 

Alpha blend

1> glEnable(GL_BLEND)

2> glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

 

参考:

http://blog.sina.com.cn/s/blog_4062094e01009iks.html

http://blog.csdn.net/lysc_forever/article/details/13614449

http://blog.163.com/jackie_howe/blog/static/199491347201231925236498/

0 0
原创粉丝点击