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

时间:2012-06-22 21:18:34

标签: opengl

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

对于cuda互操作性,最好使用“opengl buffer objects”。 (替代方案可能是纹理或表面,但这些都有缓存/并发问题,因此我的cuda内核无法使用。)

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

然后我想让opengl程序将缓冲区对象绘制到帧缓冲区。我想使用一个未弃用的opengl api。

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

现在不推荐使用glDrawPixels,在opengl 4.0中是否存在缺口/缺失功能?还是有替代方案吗?

2 个答案:

答案 0 :(得分:4)

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

您最好的选择是使用glTexSubImage2Dupload it to a texture,然后将其绘制到屏幕上。或者使用glBlitFramebuffer从纹理中将其blit。

答案 1 :(得分:2)

似乎唯一的解决方案如下:

  1. 创建一个“(opengl)像素缓冲区对象”,它有望与“(opengl)(常规)缓冲区对象”相同。

  2. 使用像素缓冲区对象实现cuda互操作性。 (如果不可能,那么尝试一般缓冲对象“

  3. 然后将像素缓冲区对象绘制为具有tex * opengl api调用的纹理,然后将纹理绘制到默认的帧缓冲区。 (这可能是双重复制,所以可能是最慢的方法。)

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