2011-09-25 75 views
3

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

+0

还有什么其他的库?这些“库”是否也可用于直接硬件访问(例如Direct3D,CUDA,OpenCL)还是使用这些功能? –

回答

5

对于绘制视频内存,您​​可以使用framebuffer objects来绘制OpenGL纹理或渲染缓冲区(用于离屏渲染的VRAM区域),就像Stefan所建议的那样。

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

如果该库使用一些其他API来连接GPU,则没有太多可能性,如果它使用OpenCL或CUDA,这些API可以直接使用它们的内存缓冲区或图像作为OpenGL缓冲区或纹理,然后你可以使用所提到的技术渲染。

如果这个库在底层使用Direct3D,它会变得更加困难,但至少nVidia有一个extension来直接使用Direct3D 9的表面和纹理作为OpenGL的缓冲区和纹理,但我没有这方面的经验,我也不知道这是否得到广泛支持。

4

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

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

+0

一些小的符号问题:1. OP已经谈到视频内存2.帧缓冲区对象不包含屏幕外上下文,只包含屏幕外缓冲区(可能您认为是Pbuffers)。 3.渲染纹理正是FBO通常使用的。 –

+0

对于“视频内存缓冲区”是指VRAM中的内存缓冲区还是含有视频的内存缓冲区,我不太确定。 – Stefan

+0

啊,我没有想到这个。我看到了视频内存,并立即想到了VRAM。但你说得对,因为它也可能意味着带有视频数据的CPU RAM。 –

相关问题