根据opengl规范4.0,不推荐使用glDrawPixels。
对于cuda互操作性,最好使用“opengl buffer objects”。 (替代方案可能是纹理或表面,但这些都有缓存/并发问题,因此我的cuda内核无法使用。)
我只想创建一个cuda内核,它使用这个映射的opengl缓冲区对象并将其用作“像素数组”或一块内存像素,稍后缓冲区将被取消映射。
然后我想让opengl程序将缓冲区对象绘制到帧缓冲区。我想使用一个未弃用的opengl api。
还有哪些方法/ api可以将缓冲区对象绘制到帧缓冲区? (也不能使用渲染缓冲区,因为它们可能与cuda数组/缓存问题有相同的问题,所以这排除了framebuffer对象/扩展名?!?)。
现在不推荐使用glDrawPixels,在opengl 4.0中是否存在缺口/缺失功能?还是有替代方案吗?
答案 0 :(得分:4)
glDrawPixels
已从GL 3.2及更高版本删除(不推荐使用。已弃用意味着“可用但将来要删除”)。它被删除了,因为它通常不是一种快速的方法来将像素数据绘制到屏幕上。
您最好的选择是使用glTexSubImage2D
到upload it to a texture,然后将其绘制到屏幕上。或者使用glBlitFramebuffer
从纹理中将其blit。
答案 1 :(得分:2)
似乎唯一的解决方案如下:
创建一个“(opengl)像素缓冲区对象”,它有望与“(opengl)(常规)缓冲区对象”相同。
使用像素缓冲区对象实现cuda互操作性。 (如果不可能,那么尝试一般缓冲对象“
然后将像素缓冲区对象绘制为具有tex * opengl api调用的纹理,然后将纹理绘制到默认的帧缓冲区。 (这可能是双重复制,所以可能是最慢的方法。)
或者尝试将像素缓冲区对象直接绘制到帧缓冲区。我不确定这是否需要特殊的帧缓冲对象/扩展。 (如果可以直接完成,这可能会更快,只需一份)。