【问题标题】:Using a framebuffer as a vertex buffer without moving the data to the CPU使用帧缓冲区作为顶点缓冲区而不将数据移动到 CPU
【发布时间】:2010-04-03 03:20:57
【问题描述】:

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

【问题讨论】:

    标签: opengl


    【解决方案1】:

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

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

    【讨论】:

    • 所以如果我每帧都这样做,那么我应该使用第二种方法(使用帧缓冲区作为顶点着色器中的纹理)?我想每帧都将帧缓冲区复制到 VBO 可能会很慢。
    • 这种事情相当依赖于硬件。可能是硬件非常擅长复制到 PBO,或者硬件没有从纹理单元到顶点着色器的管道那么多。唯一真正了解的方法是同时尝试并进行基准测试。
    • 您确定没有通过 CPU 发送数据吗?这个方法是否保证数据是由GPU从内存中获取的?
    • 没有这样的保证。这都是特定于实现的,但通常对于现代硬件,这将由驱动程序在 GPU 上完成。
    • 尝试实现后一种方法:需要注意的是 gl_FragColor 被限制在 [0,1] 范围内,因此存储为像素的世界空间位置需要进行范围压缩。
    【解决方案2】:

    只需使用函数进行复制并让驱动程序弄清楚如何执行您想要的操作,只要您直接复制到顶点缓冲区,它实际上不会进行复制,而只会制作您的 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_PACK_BUFFER 的看法是正确的,也许应该编辑一下。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多