我正在学习OpenGL,并且想知道是否可以让它在通过其他库获得的视频内存缓冲区上进行绘制?
我正在学习OpenGL,并且想知道是否可以让它在通过其他库获得的视频内存缓冲区上进行绘制?
要在视频存储器中绘制,您可以使用帧缓冲对象绘制到OpenGL纹理或渲染缓冲区(用于屏幕外渲染的VRAM区域),就像Stefan所建议的那样。
当涉及到由另一个库创建的VRAM缓冲区时,这取决于您所谈论的库。 如果该库也在底层使用OpenGL,则需要一些了解该库以获取该“缓冲区”(无论是纹理,您可以直接使用FBO进行渲染,还是GL缓冲对象,您可以使用PBO读取渲染后的像素数据)。
如果该库使用其他API与GPU进行接口交互,则可能性不多。 如果它使用OpenCL或CUDA,则这些API具有将其内存缓冲区或图像直接用作OpenGL缓冲区或纹理的函数,然后您可以使用上述技术进行渲染。
如果该库底层使用Direct3D,则会变得更加困难。 但至少nVidia有一个扩展,可直接将Direct3D 9表面和纹理用作OpenGL缓冲区和纹理,但我没有任何经验,也不知道是否得到广泛支持。
您不能让OpenGL直接绘制到任意内存中,其中一个原因是,在大多数实现中,OpenGL绘图发生在视频RAM而不是系统内存中。但是,您可以先绘制到OpenGL离屏上下文中,然后将结果读回到系统内存中的任何位置。搜索一下帧缓冲对象(FBO)的Web文档和教程应该就能指引您。
如果您拥有的内存已经在VRAM中,例如硬件加速解码,则如果它作为OpenGL纹理可用,那么您可能可以直接绘制到它上面 - 然后,您可以使用一些渲染到纹理的技术,这将节省您从VRAM传输数据的时间。