OpenGL能否在内存表面绘制?

4

我正在学习OpenGL,并且想知道是否可以让它在通过其他库获得的视频内存缓冲区上进行绘制?


还有哪些库?这些“库”是否也用于直接硬件访问(例如Direct3D,CUDA,OpenCL),或者是在底层使用这些功能? - Christian Rau
2个回答

5

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

当涉及到由另一个库创建的VRAM缓冲区时,这取决于您所谈论的库。 如果该库也在底层使用OpenGL,则需要一些了解该库以获取该“缓冲区”(无论是纹理,您可以直接使用FBO进行渲染,还是GL缓冲对象,您可以使用PBO读取渲染后的像素数据)。

如果该库使用其他API与GPU进行接口交互,则可能性不多。 如果它使用OpenCL或CUDA,则这些API具有将其内存缓冲区或图像直接用作OpenGL缓冲区或纹理的函数,然后您可以使用上述技术进行渲染。

如果该库底层使用Direct3D,则会变得更加困难。 但至少nVidia有一个扩展,可直接将Direct3D 9表面和纹理用作OpenGL缓冲区和纹理,但我没有任何经验,也不知道是否得到广泛支持。


4

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

如果您拥有的内存已经在VRAM中,例如硬件加速解码,则如果它作为OpenGL纹理可用,那么您可能可以直接绘制到它上面 - 然后,您可以使用一些渲染到纹理的技术,这将节省您从VRAM传输数据的时间。


一些小的符号问题:1. OP已经提到了视频内存 2. 帧缓冲对象不包括离屏上下文,只包括离屏缓冲区(也许您想到了Pbuffers)。3. 纹理渲染正是FBO通常用于的目的。 - Christian Rau
我不太确定问题中的“视频内存缓冲区”是指VRAM中的内存缓冲区还是包含视频的内存缓冲区。 - Stefan Werner
啊,我没有考虑到这一点。我看到视频内存就立刻想到了显存。但你说得对,它也可能是指CPU内存中的视频数据。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接