【问题标题】:How to render/draw buffer object to framebuffer without glDrawPixels如何在没有 glDrawPixels 的情况下将缓冲区对象渲染/绘制到帧缓冲区
【发布时间】:2012-06-25 05:30:15
【问题描述】:

根据 opengl 规范 4.0 glDrawPixels 已被弃用。

对于 cuda 互操作性,似乎最好使用“opengl 缓冲区对象”。 (替代方法可能是纹理或表面,但它们存在缓存/并发问题,因此不适用于我的 cuda 内核)。

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

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

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

现在 glDrawPixels 已被弃用,opengl 4.0 中是否存在空白/缺失功能?还是有其他选择?

【问题讨论】:

  • 我不明白。您的第一点指出,建议将 OpenGL 缓冲区对象用于 CUDA/OpenCL-OpenGL 互操作(它们确实如此)。您是在寻找其他替代方案还是该途径存在问题?

标签: opengl


【解决方案1】:

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

最好的办法是使用glTexSubImage2Dupload it to a texture,然后将其绘制到屏幕上。或者使用glBlitFramebuffer 将其从纹理中粘贴。

【讨论】:

  • @SkybuckFlying:glBlitFramebuffer 部分可以替代将其绘制到屏幕上。也就是说,您将上传像素数据的纹理附加到 FBO,然后将其 blit 到屏幕上。无论如何,您都将使用 glTexSubImage2D ;这只是一个问题,您是在绘制带纹理的四边形还是从纹理到默认帧缓冲区。
  • @SkybuckFlying:那不是维基百科;那是OpenGL Wiki。到底有什么不清楚的地方?
  • @SkybuckFlying 使用 glBindFramebufferGL_READ_FRAMEBUFFER/GL_DRAW_FRAMEBUFFER,但我同意这并非易事。 glDrawPixles 似乎确实更直接。真的慢吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多