Итак, я использую кадровый буфер с несколькими целями рендеринга, в котором первое вложение цвета — это цветная текстура (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_);
Обе текстуры мультисэмплированы, и я хотел бы загрузить их на процессор после завершения рендеринга. Хотя, когда я преобразовывал многовыборочный 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(), все будет работать нормально.
Я не вижу никаких документов, в которых говорится, что целочисленная текстура может быть мультисэмплирована, но даже при этом я не уверен, что они вообще имеют смысл.
Любая подсказка, где я могу ошибаться?
GL_MAX_INTEGER_SAMPLES
(поскольку оно может отличаться отGL_MAX_SAMPLES
)? Это ›1? - person Christian Rau   schedule 16.09.2013