因此,我使用了多个渲染目标帧缓冲区,在该缓冲区上,第一个颜色附件是颜色纹理(RGBA8),而第二个绘制缓冲区(颜色附件1)是索引纹理(R32UI)。
gl::BindTexture(gl::TEXTURE_2D_MULTISAMPLE, m_Textures[eTEXTURE_COLORBUFFER]);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_BASE_LEVEL, 0);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_MAX_LEVEL, 0);
gl::TexImage2DMultisample(gl::TEXTURE_2D_MULTISAMPLE, m_Multisample,gl::RGBA8,width,height,gl::FALSE_);
gl::BindTexture(gl::TEXTURE_2D_MULTISAMPLE, m_Textures[eTEXTURE_CLASSBUFFER]);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_BASE_LEVEL, 0);
gl::TexParameteri(gl::TEXTURE_2D_MULTISAMPLE, gl::TEXTURE_MAX_LEVEL, 0);
gl::TexImage2DMultisample(gl::TEXTURE_2D_MULTISAMPLE, m_Multisample,gl::R32UI,width,height,gl::FALSE_);
两种纹理都经过了多重采样,一旦渲染完成,我想将它们下载到CPU上。虽然,当我将多样本FBO分割为单样本FBO时,返回的索引纹理数据由全零组成,而颜色纹理已正确解析。
// Resolve multisampling
if ( m_Multisample > 0 )
{
gl::BindFramebuffer(gl::READ_FRAMEBUFFER, m_Framebuffers[eFBO_RENDERBUFFER]);
gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER, m_Framebuffers[eFBO_RESOLVEBUFFER]);
gl::BlitFramebuffer(0, 0, m_FrameDims, m_FrameDims, 0, 0, m_FrameDims, m_FrameDims,
gl::COLOR_BUFFER_BIT, gl::NEAREST);
gl::enum_t blit_error = gl::NO_ERROR_;
blit_error = gl::GetError();
if ( blit_error != gl::NO_ERROR_ )
{
throw framebuffer_error(string::format<128>(
"BlitFramebuffer failed with error: %d",blit_error));
}
gl::BindFramebuffer(gl::READ_FRAMEBUFFER, m_Framebuffers[eFBO_RESOLVEBUFFER]);
}
我使用NEARST标志是因为,实际上似乎整数纹理不适用于LINEAR插值。
下面列出了我用于下载图片的代码。
uint32_t* tex_data = new uint32_t[query.m_FrameDims*query.m_FrameDims];
memset(tex_data,0,sizeof(uint32_t)*query.m_FrameDims*query.m_FrameDims);
gl::BindTexture(gl::TEXTURE_2D,query.m_DestColorTexture);
{
// Copy color texture
gl::ReadBuffer(gl::COLOR_ATTACHMENT0);
gl::ReadPixels(0,0,query.m_FrameDims,query.m_FrameDims,
gl::RGBA,gl::UNSIGNED_BYTE,tex_data);
gl::TexSubImage2D(gl::TEXTURE_2D,0,0,0,query.m_FrameDims,query.m_FrameDims,
gl::RGBA,gl::UNSIGNED_BYTE,tex_data);
}
gl::BindTexture(gl::TEXTURE_2D,query.m_DestClassTexture);
{
// Copy class texture
gl::ReadBuffer(gl::COLOR_ATTACHMENT1);
gl::ReadPixels(0,0,query.m_FrameDims,query.m_FrameDims,
gl::RED_INTEGER,gl::UNSIGNED_INT,tex_data);
gl::TexSubImage2D(gl::TEXTURE_2D,0,0,0,query.m_FrameDims,query.m_FrameDims,
gl::RED_INTEGER,gl::UNSIGNED_INT,tex_data);
}
delete[] tex_data;
如果禁用多样本FBO,则避免调用gl :: BlitFramebuffer()函数,一切正常。
我看不到任何说明整数纹理可以多次采样的文档,但是尽管如此,我不确定它们是否完全有意义。
有什么线索让我误会吗?
每次进行帧缓冲区blit时,您只能从单个颜色缓冲区中读取数据。您可以写入许多绘图缓冲区(技术上最多GL_MAX_DRAW_BUFFERS
一次)。这里的问题是,您想从两个不同的颜色缓冲区中读取数据,并且试图在一次blit中进行读取。
当颜色缓冲器被传送时,值是从所拍摄的读取缓冲器的读取帧缓冲器的和写入到每个所述平局缓冲器绘制帧缓冲区。
您的代码向我指示您实际上忘记对第二个颜色附件进行第二次涂抹,这就是为什么它变空的原因。
要更正此问题,我希望看到类似以下内容的内容:
// Resolve multisampling
if ( m_Multisample > 0 )
{
//
// Do the first resolve (COLOR_ATTACHMENT0)
//
gl::BindFramebuffer(gl::READ_FRAMEBUFFER,m_Framebuffers[eFBO_RENDERBUFFER]);
gl::ReadBuffer (gl::COLOR_ATTACHMENT0); // Read: Attachment 0 (MSAA)
gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER,m_Framebuffers[eFBO_RESOLVEBUFFER]);
gl::DrawBuffer (gl::COLOR_ATTACHMENT0); // Write: Attachment 0 (Resolve)
gl::BlitFramebuffer(0, 0, m_FrameDims, m_FrameDims, 0, 0, m_FrameDims,
m_FrameDims, gl::COLOR_BUFFER_BIT, gl::NEAREST);
gl::enum_t blit_error = gl::NO_ERROR_;
blit_error = gl::GetError();
if ( blit_error != gl::NO_ERROR_ )
{
throw framebuffer_error(string::format<128>(
"BlitFramebuffer failed with error: %d",blit_error));
}
//
// Do the second resolve (COLOR_ATTACHMENT1)
//
gl::BindFramebuffer(gl::READ_FRAMEBUFFER,m_Framebuffers[eFBO_RENDERBUFFER]);
gl::ReadBuffer (gl::COLOR_ATTACHMENT1); // Read: Attachment 1 (MSAA)
gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER,m_Framebuffers[eFBO_RESOLVEBUFFER]);
gl::DrawBuffer (gl::COLOR_ATTACHMENT1); // Write: Attachment 1 (Resolve)
gl::BlitFramebuffer(0, 0, m_FrameDims, m_FrameDims, 0, 0, m_FrameDims,
m_FrameDims, gl::COLOR_BUFFER_BIT, gl::NEAREST);
gl::enum_t blit_error = gl::NO_ERROR_;
blit_error = gl::GetError();
if ( blit_error != gl::NO_ERROR_ )
{
throw framebuffer_error(string::format<128>(
"BlitFramebuffer failed with error: %d",blit_error));
}
gl::BindFramebuffer(gl::READ_FRAMEBUFFER,m_Framebuffers[eFBO_RESOLVEBUFFER]);
}
假设要从中进行贴图的纹理/渲染缓冲区/具有相同的附着点。如果没有,你可以调整gl::ReadBuffer (...)
和gl::DrawBuffer (...)
相应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句