使用帧缓冲区作为顶点缓冲区而不将数据移动到CPU

时间:2010-04-03 03:20:57

标签: opengl

在OpenGL中,有没有办法将帧缓冲数据用作顶点数据而不通过CPU移动数据?理想情况下,帧缓冲对象可以直接在GPU上重铸为顶点缓冲对象。我想使用片段着色器生成网格,然后渲染该网格。

4 个答案:

答案 0 :(得分:3)

只需使用这些函数进行复制,让驱动程序弄清楚如何做你想做的事情,只要你直接复制到顶点缓冲区,它就不会实际复制,但只会制作你的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

答案 1 :(得分:3)

有几种方法可以解决这个问题,spudd86已经提到了第一种方法(除了你需要使用GL_PIXEL_PACK_BUFFER,这是由glReadPixels写的那个)。

另一种方法是使用帧缓冲对象,然后从顶点着色器中的纹理中读取,从顶点id(您必须管理)到纹理位置的映射。如果这是一次性操作,我会将其复制到PBO,然后绑定到GL_ARRAY_BUFFER,然后将其用作VBO。

答案 2 :(得分:1)

GL_pixel_buffer_object的规范给出了一个演示如何在“使用示例”下渲染到顶点数组的示例。

以下扩展程序有助于解决此问题:

GL_texture_float - 用于颜色缓冲附件的浮点内部格式 GL_color_buffer_float - 禁用片段颜色和glReadPixels的自动钳制 GL_pixel_buffer_object - 将像素数据传输到缓冲区对象的操作

答案 3 :(得分:1)

如果可以在顶点/几何着色器中完成工作,则可以使用变换反馈直接写入缓冲区对象。这也可以跳过光栅化器和片段着色。

变换反馈可作为EXT_transform_feedback或核心版本提供,因为GL 3.0(和ARB等效)。