我有一个带有4帧缓冲纹理的FBO。这些纹理有4种不同的尺寸。
问题是如果使用:
连接纹理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的最新驱动程序这是一个已知的问题吗?
答案 0 :(得分:1)
这个问题被称为“这就是OpenGL 的工作原理。”
帧缓冲区的总大小基于所有附加图像的每个维度中的最小大小。您不能在任何附加图像之外渲染。即使您使用write masking或draw buffers状态,以便您实际上没有渲染它,可用的视口大小始终限制为附加图像的最小大小。
作为一般规则,除非您认真渲染图像,否则不要将图像附加到帧缓冲区。如果您想进行下采样,请在每次采样过程之间交换FBO或更改附加图像。
哦和BTW:它是未定义的行为(除非你使用GL 4.5或ARB / NV_texture_barrier)到read from any texture object that is currently attached to the FBO。再次,写掩码和绘制缓冲区状态是无关紧要的;重要的是图像附加。所以,除非你写信,否则不要附上一些东西。