将蒙娜丽莎呈现到PBO

4
阅读了this文章后,我想尝试做同样的事情,但为了加快渲染部分,我希望它能在GPU上执行,毋庸置疑,为什么三角形或任何其他几何对象应该在GPU上而不是CPU上呈现。以下是这个过程的一个很好的图像:

Mona Lisa

任务:

  1. 渲染“顶点集合”
  2. 逐像素估计渲染的“顶点集合”与蒙娜丽莎图像(蒙娜丽莎位于GPU中的纹理或PBO,没有太大区别)之间的差异

问题:

使用OpenGL FBO(Frame Buffer Object)扩展的OpenCL或Cuda。

在这种情况下,根据我们的任务:

  1. 渲染“顶点集合”(由OpenGL处理)
  2. 逐像素估计渲染的“顶点集合”与蒙娜丽莎图像之间的差异(由OpenCL或Cuda处理)

因此,在这种情况下,我被迫从FBO复制到PBO(Pixel Buffer Object),以使渲染的“顶点集合”可用于OpenCL/Cuda。我知道设备到设备内存复制有多快,但是考虑到我需要做成千上万次这样的复制,不这样做是有道理的...

这个问题留下了三个选择:

  1. 以OpenGL渲染到PBO(不知道如何实现,也可能无法实现
  2. 使用OpenGL完全渲染图像并估算图像之间的差异(不知道如何实现,也许可以使用着色器,唯一的问题是我从未编写过着色器,这可能需要数月时间...
  3. 使用OpenCL/Cuda完全渲染图像并估算图像之间的差异(我知道如何实现,但要实现一个稳定且优化程度较高的OpenCL或Cuda版本的渲染器可能需要数月时间

问题

有人能帮我编写上述过程的着色器,或者指出在不从FBO复制的情况下将蒙娜丽莎渲染到PBO的方法吗?


你使用的是哪种编程语言?如果你使用的是原始的C#版本,那么我通过将比较函数改为使用unsafe关键字来获得了巨大的速度提升。这使我的性能几乎翻了一倍。 - Russ Clarke
1
这门语言是C#,我正在使用自己的实现,我需要优化设备部分,而不是C#部分... - Lu4
你不能直接在CUDA或OpenCL中读取OpenGL纹理吗?我认为它们也支持2D图像,可以直接连接到OpenGL纹理,但我准备接受相反的观点。这将使您免于复制,因为FBO可以直接渲染到纹理中。 - Christian Rau
是的,我可以使用Cuda和OpenCL直接从纹理中读取数据,但是如何直接将渲染结果输出到纹理中呢? - Lu4
1个回答

1

我的直觉是,着色器方法也会有相同的IO问题,只要GPU支持PS 4.0或更高版本,您可以在着色器中比较纹理;但首先仍然需要将源纹理(蒙娜丽莎)传输到设备上。

编辑:我查找了一些资料,这个论坛帖子可能提供一些见解:

http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=221384&page=1

发布者Komat在第二页提供了着色器示例。


1
是的,明确的是,蒙娜丽莎应该在设备上,这不是问题。 - Lu4
Pixel Shader 4.0的规范,也许在你眼中就是片段着色器的规范? - Russ Clarke
如果您支持OpenGL 4.1,则您的GPU确实支持此功能,这很好。 - Russ Clarke
你如何直接渲染到纹理? - Lu4
好的,我将尝试将2D纹理对象绑定到FBO的颜色附件。 - Lu4
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接