有可能让OpenGL在内存表面上绘图吗?



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

对于绘制到视频内存,您可以使用framebuffer对象绘制到OpenGL纹理或渲染缓冲区(VRAM区域的屏幕外渲染),如Stefan建议。

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

如果这个库使用其他API来连接GPU,就没有那么多的可能性了。如果它使用OpenCL或CUDA,这些api具有直接使用其内存缓冲区或图像作为OpenGL缓冲区或纹理的功能,然后您可以使用上述技术进行渲染。

如果这个库在底层使用Direct3D,它会变得有点困难。但至少nVidia有一个扩展,可以直接使用Direct3D 9表面和纹理作为OpenGL缓冲和纹理,但我没有任何经验,也不知道这是否被广泛支持。

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

如果你的内存已经在VRAM中,例如通过硬件加速解码,那么你可能能够直接绘制它,如果它是可用的OpenGL纹理-然后你可以使用一些渲染到纹理的技术,这将节省你从VRAM传输数据。

最新更新