【问题标题】:OpenGL FBO colour attachment shrinkingOpenGL FBO 颜色附件缩小
【发布时间】:2025-12-26 08:05:11
【问题描述】:

我有一个带有 4 个帧缓冲区纹理的 FBO。这些纹理有 4 种不同的尺寸。

  • 纹理 1 = 512 * 360
  • 纹理 2 = 256 * 180
  • 纹理 3 = 128 * 90
  • 纹理 4 = 64 * 45

问题是,如果纹理 4 和纹理 1 例如使用以下方法附加:

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, bl_64, 0);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, bl_128, 0);

当我绘制到纹理 1 时,纹理上的图像只占用纹理 4 的大小。

 m_blurrFBO.DrawingBind();   
 glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 1, &BlurrPass);  
 glViewport(0, 0, 512, 360);
 glDrawBuffer(GL_COLOR_ATTACHMENT0);
 DrawQuad();       
 FBO::UnbindDrawing();

我使用 4 种不同尺寸的不同纹理的原因是我将同一张图像向下采样 4 次,每张图像的尺寸是上一张的一半。

问题是代码已经在 5 台不同的计算机上测试过,它们都使用 AMD 或 NVIDIA 卡,并且可以正常工作。我的 nvidia gtx 550 有最新的驱动程序,这是一个已知问题吗?

【问题讨论】:

  • 从技术上讲,是最后一个尺寸的 1/4。它在每个维度上是 1/2 大小,如果你平方,你会得到 1/4。我很难理解的真正问题是为什么你需要你的 FBO 来包含来自以前下采样通道的纹理。如果你要写信,你只需要附加到 FBO 的东西,你不应该写以前的通行证。
  • 我附上了所有图像,然后使用 gldrawbuffer 绘制到每个单独的图像。我现在知道这不是最好的解决方案。

标签: opengl fbo


【解决方案1】:

这个问题被称为“OpenGL 是这样工作的。

帧缓冲区的总大小基于所有附加图像在每个维度上的最小大小。您不得在任何附加图像之外进行渲染。即使您使用write maskingdraw buffers 状态以便您实际上不对其进行渲染,可用的视口大小也总是限制为附加图像的最小大小。

作为一般规则,除非您认真对待渲染,否则不要将图像附加到帧缓冲区。如果您想进行下采样,请在每个采样通道之间交换 FBO 或更改附加图像。

哦,顺便说一句:read from any texture object that is currently attached to the FBO 是未定义的行为(除非您使用 GL 4.5 或 ARB/NV_texture_barrier)。同样,写入掩码和绘制缓冲区状态无关紧要;重要的是图像已附加。再说一次,除非你正在写东西,否则不要附加任何东西。

【讨论】:

  • 那么问题是哪个更快?为不同的图像大小设置单独的 FBO,或者在每个采样过程中更改图像附件?