渲染到TBO

时间:2016-10-07 13:50:17

标签: opengl

我需要渲染到Buffer texture。为何选择TBO? TBO可以很容易地映射为图形互操作的CUDA资源。它还可以存储字节大小的数据,这是我需要的。我试图在GL规范中找到相关信息。 Here声明:

  

缓冲纹理就像一维纹理一样,只有一个图像,   由mipmap level 0识别。

但是当我尝试将TBO附加到FBO时,我总是得到"缺少附件"检查完整性时出错,这导致我得出结论:GL_TEXTURE_BUFFER不支持作为FBO附件。

两个问题:

  1. 是真的吗?
  2. 这是写SSBO
  3. 的唯一选择

    更详细的信息:

    我正在

      

    GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT

    当我试图将TBO附加到帧缓冲区时。没有必要在这里附加整个代码,因为它既是抽象的API,也不相信我,我在使用OpenGL和framebuffers时非常有经验。附加一个常规的GL_TEXTURE_2D效果很好。 以下是TBO创建的大块和附件阶段:

    GLuint tbo;
    GLuint tboTex;
    glGenBuffers(1, &tbo);
    glBindBuffer(GL_TEXTURE_BUFFER, tbo);
    glBufferData(GL_TEXTURE_BUFFER, viewportWidth * viewportHeight * 4, NULL, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_TEXTURE_BUFFER, 0);
    glGenTextures(1, &tboTex);
    glBindTexture(GL_TEXTURE_BUFFER, tboTex);
    glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA8, tbo);
    glBindTexture(GL_TEXTURE_BUFFER, 0);
    

    然后附加到FBO:

    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tboTex, 0);
    
    ///also tried:
    /// glFramebufferTexture1D
    /// glFramebufferTexture2D
    

1 个答案:

答案 0 :(得分:1)

Buffer textures cannot be attached to FBOs

  如果GL_INVALID_OPERATION是缓冲区纹理,则[pic]生成

texture

很好地提醒您应该始终检查OpenGL错误。

  

这是写SSBO的唯一选择

如果您的目标是使用渲染操作将内容写入缓冲区对象,则还可以将Image Load/Store operations与缓冲区纹理结合使用。但是如果你的硬件可以处理它,那么它也应该处理SSBO。

您还可以尝试使用geometry shaderstransform feedback operations来撰写您尝试撰写的任何内容。

然而:

  

它还可以存储字节大小的数据

图像可以存储"字节大小的数据"同样。图像格式GL_R8UI表示单通道,8位无符号整数。

这并没有解决任何CUDA-interop问题,但很有可能渲染到字节。