如何在视觉上定义将纹理数组附加到 FBO 的颜色附加点?

Posted

技术标签:

【中文标题】如何在视觉上定义将纹理数组附加到 FBO 的颜色附加点?【英文标题】:How to you define attaching a texture array to a FBO's color attachment point visually? 【发布时间】:2013-08-17 08:42:26 【问题描述】:

我读到在分层渲染中,我们创建了一个 2D 纹理数组 (GL_TEXTURE_2D_ARRAY):

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, TextureColorbufferName);
glTexParameteri(....
glTexImage3D(...

并且可以将其附加到 FBO:

glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, TextureColorbufferName, 0);

我发现在视觉上难以理解的是,如何将一层纹理绑定到 FBO 中的单一颜色附着点?颜色附件 0(或任何 GL_COLOR_ATTACHMENTi )本身不是一个“图像”吗?

更详细的:

在阅读纹理数组之前,这是我对 FBOS 的理解

                      +--------------+
         +-----------+| FBO object   ++--------------------------------------------+
         |            |              +---------------------+                       |
         |            +--------------+                     |                       |
         |                     +                           |                       |
         |                     |                           |                       |
         |                     |                           |                       |
         v                     v                           v                       v
 +-----------------+     +-----------------+      +-----------------+       +------------------+
 |color attachment |     |color attachment |      |depth attachment |       |stencil attachment|
 |    0            |     |   1             |      |                 |       |                  |
 +-----------------+     +-----------------+      +-----------------+       +------------------+
                                                                               (this too)
  (this is actually        (this is also a                (this too)
   one texture or          texture of renderbuffer)
    one renderbuffer)

但是在阅读了纹理数组之后,真的是这样吗?

                          +--------------+
             +-----------+| FBO object   ++--------------------------------------------+
             |            |              +---------------------+                       |
             |            +--------------+                     |                       |
             |                     +                           |                       |
             |                     |                           |                       |
             |                     |                           |                       |
             v                     v                           v                       v
     +-----------------+     +-----------------+      +-----------------+       +------------------+
     |color attachment |     |color attachment |      |depth attachment |       |stencil attachment|
     |    0            |     |   1             |      |                 |       |                  |
     +-----+--+------+-+     +-----------------+      +-----------------+       +------------------+
           |  |      |
           |  |      v+
           |  v+      +----------------------------------+
           |   +--------->+                              v
           v              |                              +
  +----------------+  +---v-------------+                |
  |                |  |                 |            +---v------------+
  |texture array[0]|  |texture array[1] |            |texture array[n]|
  |                |  |                 |            |                |
  |                |  |                 |            |                |
  |                |  |                 |            |                |
  +----------------+  +-----------------+            +----------------+

即每个附件本身是各种纹理的集合吗?

我很难想象一种颜色的附着点如何映射到多个纹理。

如果我从 1 个 FBO(绑定到 texture_2d_array)到另一个(绑定到 texture_2d)会发生什么

【问题讨论】:

我不太明白这个问题。它之所以有效,是因为 OpenGL 定义它确实有效。进入帧缓冲区绑定点的内容正是 OpenGL 所说 所包含的内容。 我更详细地编辑了我的问题。谢谢 【参考方案1】:

纹理是图像的集合。您不将纹理附加到 FBO 附加点;您将图像纹理中附加到 FBO 连接点。

因此,您绝不会将多个 纹理 附加到单个附加点。

Array textures 只是在 mipmap 级别中存储图像数组的纹理。非数组 2D 纹理每个 mipmap 级别仅存储一个图像。一个立方体贴图为每个 mipmap 存储 6 个图像。数组纹理存储用户提供的每个 mipmap 数量的图像。

但是,您可以将layered image 附加到附加点。 array texture 的 mipmap 级别是分层图像,其他一些东西也是如此。

从分层图像构建的 FBO 可通过几何着色器用于layered rendering。这允许 GS 将特定的原始输出通过管道传输到分层 FBO 中的特定层索引。

你如何想象这取决于你。

【讨论】:

@Nicol.As 你指出this link 也是一个很好的解释。谢谢。 经过大量阅读和反复试验,我终于用glFramebufferTextureLayer解决了这个问题。我最初试图将数组纹理与glFramebufferTexture3D 绑定。把它留在这里以防它对某人有帮助。

以上是关于如何在视觉上定义将纹理数组附加到 FBO 的颜色附加点?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将默认渲染缓冲区附加到 FBO?

将opengl主帧缓冲区复制到fbo

在 CUDA 中修改 OpenGL FBO 纹理附件

为啥从 FBO 解除绑定纹理会清除纹理?

OpenGL FBO 多个纹理

如何从 FBO 获得更清晰的画面?