【问题标题】:Is it possible to have OpenGL draw on a memory surface?是否可以让 OpenGL 在内存表面上绘制?
【发布时间】:2011-09-25 20:58:05
【问题描述】:

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

【问题讨论】:

  • 还有哪些库?这些“库”是否也用于直接硬件访问(例如 Direct3D、CUDA、OpenCL)或在后台使用此类功能?

标签: opengl


【解决方案1】:

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

当涉及到由另一个库创建的 VRAM 缓冲区时,这取决于您所谈论的库。如果这个库在后台也使用 OpenGL,您需要深入了解该库以获取该“缓冲区”(无论是纹理,您可以使用 FBO 直接渲染到其中,或者是 GL 缓冲区对象,您可以在其中读取渲染的内容)像素数据使用PBOs

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 一些小的符号问题: 1. OP 已经谈到视频内存 2. 帧缓冲区对象不包含屏幕外上下文,仅包含屏幕外缓冲区(也许您想到了 Pbuffers)。 3. 渲染到纹理正是 FBO 通常用于的用途。
    • 我不太确定“视频内存缓冲区”是指 VRAM 中的内存缓冲区还是包含视频的内存缓冲区。
    • 啊,我没想到这个。我看到显存,立刻想到了显存。但你说得对,它也可能意味着带有视频数据的 CPU RAM。
    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 2014-07-24
    • 1970-01-01
    • 2017-11-29
    • 2014-02-25
    • 2012-10-24
    • 2014-04-05
    • 2016-05-22
    相关资源
    最近更新 更多