【发布时间】:2010-04-03 03:20:57
【问题描述】:
在 OpenGL 中,有没有办法将帧缓冲区数据用作顶点数据,而无需通过 CPU 移动数据?理想情况下,帧缓冲区对象可以直接在 GPU 上重铸为顶点缓冲区对象。我想使用片段着色器生成网格,然后渲染该网格。
【问题讨论】:
标签: opengl
在 OpenGL 中,有没有办法将帧缓冲区数据用作顶点数据,而无需通过 CPU 移动数据?理想情况下,帧缓冲区对象可以直接在 GPU 上重铸为顶点缓冲区对象。我想使用片段着色器生成网格,然后渲染该网格。
【问题讨论】:
标签: opengl
有几种方法可以解决这个问题,spudd86 已经提到了第一种方法(除非你需要使用GL_PIXEL_PACK_BUFFER,这是glReadPixels 写的那个)。
另一种是使用帧缓冲区对象,然后在顶点着色器中读取其纹理,从顶点 id(您必须管理)映射到纹理位置。如果这是一次性操作,尽管我会将其复制到 PBO,然后绑定到 GL_ARRAY_BUFFER,然后将其用作 VBO。
【讨论】:
只需使用函数进行复制并让驱动程序弄清楚如何执行您想要的操作,只要您直接复制到顶点缓冲区,它实际上不会进行复制,而只会制作您的 VBO对数据的引用。
需要注意的主要事情是,某些驱动程序可能不喜欢您使用您告诉它用于顶点数据和像素数据操作的东西...
编辑:可能像下面这样的东西可能会或可能不会起作用......(IIRC规范说它应该)
int vbo;
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, vbo);
// use appropriate pixel formats and size
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo);
// draw stuff
已编辑以更正缓冲区绑定,感谢 Phineas
【讨论】:
GL_pixel_buffer_object 的规范在“使用示例”下提供了一个示例来演示如何渲染到顶点数组。
以下扩展有助于解决此问题:
GL_texture_float - 用于颜色缓冲区附件的浮点内部格式 GL_color_buffer_float - 禁用片段颜色和 glReadPixels 的自动钳位 GL_pixel_buffer_object - 将像素数据传输到缓冲区对象的操作
【讨论】:
如果您可以在顶点/几何着色器中完成工作,则可以使用变换反馈直接写入缓冲区对象。这也有跳过光栅化器和片段着色的选项。
自 GL 3.0(和 ARB 等效版本)以来,转换反馈可作为 EXT_transform_feedback 或核心版本提供。
【讨论】: