Opengl 如何在没有glDrawPixels的情况下将缓冲区对象渲染/绘制到帧缓冲区

Opengl 如何在没有glDrawPixels的情况下将缓冲区对象渲染/绘制到帧缓冲区,opengl,Opengl,根据opengl规范4.0,不推荐使用glDrawPixels 对于cuda互操作性,似乎最好使用“opengl缓冲区对象”。(另一种选择可能是纹理或曲面,但它们存在缓存/并发问题,因此无法用于我的cuda内核) 我只想创建一个cuda内核,它使用这个映射的opengl缓冲区对象,并将其用作“像素数组”或一块保存像素的内存,然后取消映射缓冲区 然后我希望opengl程序将缓冲区对象绘制到帧缓冲区。我想使用一个opengl api,它没有被弃用 还有哪些其他方法/API可以将缓冲区对象绘制到帧缓冲

根据opengl规范4.0,不推荐使用glDrawPixels

对于cuda互操作性,似乎最好使用“opengl缓冲区对象”。(另一种选择可能是纹理或曲面,但它们存在缓存/并发问题,因此无法用于我的cuda内核)

我只想创建一个cuda内核,它使用这个映射的opengl缓冲区对象,并将其用作“像素数组”或一块保存像素的内存,然后取消映射缓冲区

然后我希望opengl程序将缓冲区对象绘制到帧缓冲区。我想使用一个opengl api,它没有被弃用

还有哪些其他方法/API可以将缓冲区对象绘制到帧缓冲区?(也不能使用渲染缓冲区,因为它们可能与cuda阵列/缓存问题有相同的问题,所以这排除了帧缓冲区对象/扩展?!?)


既然glDrawPixels已被弃用,opengl 4.0中是否存在漏洞/功能缺失?或者是否有替代方案?

glDrawPixels
已从GL 3.2及以上版本中删除(未弃用。弃用的意思是“可用,但将来将被删除”)。它被删除了,因为它通常不是一种将像素数据绘制到屏幕上的快速方法


你最好的选择是使用,然后将其绘制到屏幕上。或者使用从纹理中删除它。

似乎唯一的解决方案是:

  • 创建一个“(opengl)像素缓冲区对象”,希望它与一个“(opengl)(通用)缓冲区对象”相同

  • 使用像素缓冲区对象实现cuda互操作性。(如果不可能,请尝试常规缓冲区对象”

  • 然后使用tex*opengl api调用将像素缓冲区对象绘制到纹理,然后将纹理绘制到默认帧缓冲区。 (这可能是双拷贝,因此可能是最慢的方法。)

  • 或者尝试将像素缓冲区对象直接绘制到帧缓冲区。我不确定这是否需要特殊的帧缓冲区对象/扩展。 (如果可以直接完成,这可能会更快,只需一份副本)

  • 从单独答案中删除的其他信息,但将包括在此处:


    cuda手册提到了三种可能的opengl互操作性:

    Buffer objects
    Textures
    Render buffers
    
    cuda手册还提到,如果同一内核调用中的多个线程读取/写入相同的像素,则纹理和渲染缓冲区会被缓存,并且会出现并发问题

    也许我的内核只需要将输出写入每个像素一次,所以我可能不用使用纹理或渲染缓冲区。但是并发性问题让我有点紧张…如果它真的想从多个线程多次读取/写入同一像素呢?我想在这种情况下,我将不得不使用缓冲区对象

    此外,缓冲区对象似乎也很方便,因为它们也可以用作cuda内核的源对象…因此它具有多个功能、输入和输出。因此,它可能是开始支持的最佳选项。但是,我还不确定缓冲区对象是否等于像素缓冲区对象。不过,我想是这样的……)


    与2和3相比,2和3似乎更容易实现,它们需要额外的api调用和类型。

    我不明白。您的第一点是,建议CUDA/OpenCL OpenGL interop使用OpenGL缓冲区对象(它们是)。您是否在寻找其他替代方案,或者该方法存在问题?cuda手册提到了三种cuda图形与opengl互操作性的解决方案:缓冲区对象、纹理和渲染缓冲区。该手册稍后提到了纹理和渲染缓冲区在多线程读写时存在缓存问题。因此,我来到这里我自己得出的结论是,剩下的唯一选项是“缓冲区对象”。现在的问题是如何“用opengl显示缓冲区对象”" ?1. glTexSubImage2D确实可能是一个解决方案。2.glBlitFramebuffer可能仅用于在读和写帧缓冲区之间进行复制,因此这不是一个解决方案。@SkybuckFlying:glBlitFramebuffer部分是将其绘制到屏幕的替代方案。也就是说,将上载像素数据的纹理附加到FBO,然后将其blit到屏幕上。不管怎样,您都将使用glTexSubImage2D;这只是一个问题,你是在画一个带纹理的四边形,还是在从纹理到默认帧缓冲区的间歇。好的,我现在明白了。。。当glBlitFramebufferEXT还是一个扩展时,我确实尝试过它。我想这有点奏效,我记不清了。多线程可能有问题,也可能没有。。。时间很晚了,我必须去睡觉,所以没有时间在我的驱动器上搜索一个示例,看看它是如何工作的。目前,我可能正在避免使用帧缓冲区,而只是简单地使用纹理绘制默认帧缓冲区,到目前为止,它似乎工作得很好。@SkybuckFlying:这不是维基百科;这就是OpenGL Wiki。还有什么是不清楚的?不清楚如何指定与fbo相关的源和目标。。。它可能需要一些额外的api与glBlitFramebuffer相结合,比如glReadBuffer(…)、glWriteBuffer(…)或其他什么。。。此链接包含比上面的wiki链接更多的信息: