现在的位置: 首页 > 综合 > 正文

opengl学习笔记(双缓冲与融合技术)

2013年01月22日 ⁄ 综合 ⁄ 共 1099字 ⁄ 字号 评论关闭

今天看了看opengl的融合技术,联系前一段时间老师让我改的一个用他自己的框架实现的3d物体透明融合的程序,感觉到老师说的思路,不可以实现。

因为三维的透明物体,简单的使用融合功能和融合因子是不够的,三维物体有远近,因此三维物体的绘制过程是利用的是深度缓冲技术。这样的话,对于绘制透明物体与不透明物体,顺序是十分关键的。一般来说,应该先画不透明物体,因为透明物体的绘制需要opengl的融合功能,

 

glEnable(GL_BLEND);

,但是融合功能一旦启动,会影响后继物体的着色。但是先画不透明物体,又会产生新的问题。因为透明物体往往在不透明物体的前面,所以在深度测试中,透明物体的点会通过测试,所以会绘制新点,而把原来的不透明物体的点覆盖掉。这是,opengl用了一个方法,当画完不透明物体后,立即将深度缓冲进行屏蔽,即修改深度缓冲为只读模式,不能再向深度缓冲中写入信息。这样就避免了不透明物体的深度信息遭到破坏。同时opengl还从深度缓冲中读取深度信息,从而决定了不透明物体哪些点需要进行融合。

因此总结了采用融合技术绘制三维物体的步骤:

1.启动深度测试

 

glEnable(GL_DEPTH_TEST)

2.绘制不透明物体

3.设置深度缓冲为只读模式

 

glDepthMask(GL_FALSE)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA,GL_ONE)

4.绘制透明物体

5.恢复深度缓冲的可写属性

 

glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

在运用window平台时,需要在PIXELFORMATDESCRIPTOR结构中设置双缓冲。

    static PIXELFORMATDESCRIPTOR pfd={
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};

同时利用SwapBuffer()这个函数进行缓冲的交换,在缓冲交换之前,必须进行同步操作。

opengl提供了两个同步操作函数glFlush()和glFish()

glFlush()函数用于表明先前被送到的所有指令必须在有限时间内完成。在网络模式下,该函数可以强制客户端在由命令组成的网络包还没有填满的情况下不等待命令而发送该包,以便绘图工作可以继续进行。而glFinish()则用于强制完成先前所有的指令。

【上篇】
【下篇】

抱歉!评论已关闭.