OPENGL怎么读深度缓存区的数据

OPENGL怎么读深度缓存区的数据,第1张

读取帧缓存中(x,y)点的深度值保存到Depth里

-----

这个(x,y)点和物体的顶点(Vertex)一样是参与了各种变换的(视变换/投影变换),所以可能并不是最终的窗口的(x,y)的位置。如果需要窗口中从(x,y)开始的数据,需要指定(x,y)是位于窗口坐标的

我也是菜鸟啊 ,我的设计还没开始呢 ,下面这段话希望能对你有帮助,网上一个教程上看到的

前面已经提到过,载入一幅纹理所需要的时间是比较多的。因此应该尽量减少载入纹理的次数。如果只有一幅纹理,则应该在第一次绘制前就载入它,以后就不需要再次载入了。这点与glDrawPixels函数很不相同。每次使用glDrawPixels函数,都需要把像素数据重新载入一次,因此用 glDrawPixels函数来反复绘制图象的效率是较低的(如果只绘制一次,则不会有此问题),使用纹理来反复绘制图象是可取的做法。

但是,在每次绘制时要使用两幅或更多幅的纹理时,这个办法就行不通了。你可能会编写下面的代码:

glTexImage2D( / / ); // 载入第一幅纹理

// 使用第一幅纹理

glTexImage2D( / / ); // 载入第二幅纹理

// 使用第二幅纹理

// 当纹理的数量增加时,这段代码会变得更加复杂。

在绘制动画时,由于每秒钟需要将画面绘制数十次,因此如果使用上面的代码,就会反复载入纹理,这对计算机是非常大的负担,以目前的个人计算机配置来说,根本就无法让动画能够流畅的运行。因此,需要有一种机制,能够在不同的纹理之间进行快速的切换。

纹理对象正是这样一种机制。我们可以把每一幅纹理(包括纹理的像素数据、纹理大小等信息,也包括了前面所讲的纹理参数)放到一个纹理对象中,通过创建多个纹理对象来达到同时保存多幅纹理的目的。这样一来,在第一次使用纹理前,把所有的纹理都载入,然后在绘制时只需要指明究竟使用哪一个纹理对象就可以了。

使用纹理对象和使用显示列表有相似之处:使用一个正整数来作为纹理对象的编号。在使用前,可以调用glGenTextures来分配纹理对象。该函数有两种比较常见的用法:

GLuint texture_ID;

glGenTextures(1, &texture_ID); // 分配一个纹理对象的编号

或者:

GLuint texture_ID_list[5];

glGenTextures(5, texture_ID_list); // 分配5个纹理对象的编号

零是一个特殊的纹理对象编号,表示“默认的纹理对象”,在分配正确的情况下,glGenTextures不会分配这个编号。与glGenTextures对应的是glDeleteTextures,用于销毁一个纹理对象。

在分配了纹理对象编号后,使用glBindTexture函数来指定“当前所使用的纹理对象”。然后就可以使用glTexImage系列函数来指定纹理像素、使用glTexParameter系列函数来指定纹理参数、使用glTexCoord系列函数来指定纹理坐标了。如果不使用 glBindTexture函数,那么glTexImage、glTexParameter、glTexCoord系列函数默认在一个编号为0的纹理对象上进行 *** 作。glBindTexture函数有两个参数,第一个参数是需要使用纹理的目标,因为我们现在只学习二维纹理,所以指定为 GL_TEXTURE_2D,第二个参数是所使用的纹理的编号。

使用多个纹理对象,就可以使OpenGL同时保存多个纹理。在使用时只需要调用glBindTexture函数,在不同纹理之间进行切换,而不需要反复载入纹理,因此动画的绘制速度会有非常明显的提升。典型的代码如下所示:

// 在程序开始时:分配好纹理编号,并载入纹理

glGenTextures( / / );

glBindTexture(GL_TEXTURE_2D, texture_ID_1);

// 载入第一幅纹理

glBindTexture(GL_TEXTURE_2D, texture_ID_2);

// 载入第二幅纹理

// 在绘制时,切换并使用纹理,不需要再进行载入

glBindTexture(GL_TEXTURE_2D, texture_ID_1); // 指定第一幅纹理

// 使用第一幅纹理

glBindTexture(GL_TEXTURE_2D, texture_ID_2); // 指定第二幅纹理

// 使用第二幅纹理

提示:纹理对象是从OpenGL 11版开始才有的,最旧版本的OpenGL 10并没有处理纹理对象的功能。不过,我想各位的机器不会是比OpenGL 11更低的版本(Windows 95就自带了OpenGL 11版本,遗憾的是,Microsoft对OpenGL的支持并不积极,Windows XP也还采用11版本。据说Vista使用的是OpenGL 14版。当然了,如果安装显卡驱动的话,现在的主流显卡一般都附带了适用于该显卡的OpenGL 14版或更高版本),所以这个问题也就不算是问题了。

建立framebuffer

建立一个深度renderbuffer

建立一个纹理作为color_attachment

绑定renderbuffer和纹理到framebuffer

渲染的时候将渲染的目的地设为刚刚建立的framebuffer

在屏幕上画一个quad,将framebuffer纹理贴在上面。

这样可以对渲染出来的纹理进行 *** 作,可以实现一些screen space的算法。如gaussain blur之类的。做shadow map的时候也需要fbo

以上就是关于OPENGL怎么读深度缓存区的数据全部的内容,包括:OPENGL怎么读深度缓存区的数据、OpenGL 3D纹理贴图问题、请教关于opengl中FBO离屏渲染的使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9461922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存