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

Opengl 将帧缓冲区用作顶点缓冲区而不将数据移动到CPU,opengl,Opengl,在OpenGL中,有没有一种方法可以在不通过CPU移动数据的情况下将帧缓冲区数据用作顶点数据?理想情况下,帧缓冲区对象可以直接在GPU上重铸为顶点缓冲区对象。我想使用片段着色器生成一个网格,然后渲染该网格。只需使用函数进行复制,并让驱动程序了解如何执行所需操作,很可能只要直接复制到顶点缓冲区,它实际上不会进行复制,而只是将VBO作为数据的引用 需要注意的主要问题是,某些驱动程序可能不喜欢您使用您告诉它的顶点数据操作和像素数据操作 编辑:可能像下面这样的东西可能行得通,也可能行不通。。。(IIRC

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

只需使用函数进行复制,并让驱动程序了解如何执行所需操作,很可能只要直接复制到顶点缓冲区,它实际上不会进行复制,而只是将VBO作为数据的引用

需要注意的主要问题是,某些驱动程序可能不喜欢您使用您告诉它的顶点数据操作和像素数据操作

编辑:可能像下面这样的东西可能行得通,也可能行不通。。。(IIRC规范说应该)


编辑以更正缓冲区绑定感谢Phineas

有两种方法可以做到这一点,Spud86已经提到了第一种方法(除了需要使用
GL\u PIXEL\u PACK\u buffer
,这是由
glReadPixels
写入的方法)

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

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

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

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

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


自GL 3.0(以及ARB等效版本)以来,变换反馈可以作为EXT_Transform_feedback或core版本提供。

因此,如果我每帧都这样做,那么我应该使用第二种方法(在顶点着色器中将帧缓冲区用作纹理)?我想象将帧缓冲区复制到VBO的每一帧都可能很慢。这种事情相当依赖于硬件。可能是硬件非常擅长复制到PBO,也可能是硬件没有足够多的从纹理单元到顶点着色器的管道。唯一真正知道的方法是同时尝试和基准测试。您确定数据不会通过CPU发送吗?此方法是否保证数据由GPU从内存中取回?没有这样的保证。这都是特定于实现的,但一般来说,对于现代硬件来说,这将由驱动程序在GPU上完成。在尝试实现后一种方法后:一个警告是gl_FragColor被钳制在[0,1]范围内,因此,存储为像素的世界空间位置需要进行范围压缩。如果一只流浪猫关于GL_像素_块_缓冲区的描述是正确的,也许应该对其进行编辑。
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