【发布时间】:2011-09-25 20:58:05
【问题描述】:
我开始学习 OpenGL,我想知道是否可以让它在我通过其他库获得的视频内存缓冲区上绘制?
【问题讨论】:
-
还有哪些库?这些“库”是否也用于直接硬件访问(例如 Direct3D、CUDA、OpenCL)或在后台使用此类功能?
标签: opengl
我开始学习 OpenGL,我想知道是否可以让它在我通过其他库获得的视频内存缓冲区上绘制?
【问题讨论】:
标签: opengl
要绘制到视频内存中,您可以使用 framebuffer objects 绘制到 OpenGL 纹理或渲染缓冲区(用于离屏渲染的 VRAM 区域),就像 Stefan 建议的那样。
当涉及到由另一个库创建的 VRAM 缓冲区时,这取决于您所谈论的库。如果这个库在后台也使用 OpenGL,您需要深入了解该库以获取该“缓冲区”(无论是纹理,您可以使用 FBO 直接渲染到其中,或者是 GL 缓冲区对象,您可以在其中读取渲染的内容)像素数据使用PBOs。
如果这个库使用其他一些 API 来连接 GPU,那么可能性就不大了。如果它使用 OpenCL 或 CUDA,这些 API 具有直接使用其内存缓冲区或图像作为 OpenGL 缓冲区或纹理的功能,然后您可以使用上述技术进行渲染。
如果这个库在底层使用 Direct3D,它会变得有点困难。但至少 nVidia 有一个extension 可以直接使用 Direct3D 9 表面和纹理作为 OpenGL 缓冲区和纹理,但我对此没有任何经验,也不知道这是否得到广泛支持。
【讨论】:
您不能让 OpenGL 直接绘制到任意内存,原因之一是在大多数实现中,OpenGL 绘制发生在视频 RAM 中,而不是系统内存中。但是,您可以绘制到 OpenGL 屏幕外上下文,然后将结果读回系统内存中的任何位置。对帧缓冲区对象 (FBO) 的网络搜索应该会指向文档和教程。
如果您拥有的内存已经在 VRAM 中,例如通过硬件加速解码,那么如果它可以作为 OpenGL 纹理使用,您可能可以直接绘制到它 - 然后您可以使用一些渲染到纹理技术,节省您在显存之间传输数据的时间。
【讨论】: