OpenGL FBO颜色附件收缩

时间:2015-12-22 20:02:25

标签: opengl fbo

我有一个带有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的最新驱动程序这是一个已知的问题吗?

The sunset should take up the full size of the screen

1 个答案:

答案 0 :(得分:1)

这个问题被称为“这就是OpenGL 的工作原理。

帧缓冲区的总大小基于所有附加图像的每个维度中的最小大小。您不能在任何附加图像之外渲染。即使您使用write maskingdraw buffers状态,以便您实际上没有渲染它,可用的视口大小始终限制为附加图像的最小大小。

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

哦和BTW:它是未定义的行为(除非你使用GL 4.5或ARB / NV_texture_barrier)到read from any texture object that is currently attached to the FBO。再次,写掩码和绘制缓冲区状态是无关紧要的;重要的是图像附加。所以,除非你写信,否则不要附上一些东西。