是否有可能在内存表面上绘制OpenGL?

时间:2011-09-25 20:58:06

标签: opengl

我开始学习OpenGL,我想知道是否可以将它绘制在我通过其他库获得的视频内存缓冲区上?

2 个答案:

答案 0 :(得分:5)

要绘制到视频内存中,您可以使用framebuffer objects绘制OpenGL纹理或渲染缓冲区(用于屏幕外渲染的VRAM区域),就像Stefan建议的那样。

当涉及到由另一个库创建的VRAM缓冲区时,它取决于您正在谈论的库。如果这个库也在底层使用OpenGL,你需要深入了解库以获得“缓冲区”(可以是一个纹理,你可以使用FBO直接渲染到它,或者一个GL缓冲对象,你可以在其中读取渲染)像素数据使用PBOs

如果这个库使用其他API来连接GPU,那么可能性不大。如果它使用OpenCL或CUDA,这些API具有直接使用其内存缓冲区或图像作为OpenGL缓冲区或纹理的功能,您可以使用上述技术将其渲染到其中。

如果这个库在引擎盖下使用Direct3D,则会变得更加困难。但至少nVidia有extension直接使用Direct3D 9表面和纹理作为OpenGL缓冲区和纹理,但我对此没有任何经验,也不知道这是否得到广泛支持。

答案 1 :(得分:4)

你不能让OpenGL直接绘制到任意内存,原因之一是在大多数实现中,OpenGL绘图发生在视频RAM中,而不是系统内存中。但是,您可以绘制到OpenGL屏幕外的上下文,然后将结果读回系统内存中的任何位置。对帧缓冲对象(FBO)的Web搜索应该指向文档和教程。

如果您拥有的内存已经在VRAM中,例如通过硬件加速解码,那么您可以直接绘制它,如果它可以作为OpenGL纹理使用 - 那么您可以使用一些渲染到纹理技术保存您从VRAM传输数据。