Я пытаюсь размыть текстуру глубины, размывая и смешивая уровни mipmap в фрагментном шейдере.
У меня есть два объекта мошенников:
1) Цветной мошенник с прикрепленным объектом рендеринга глубины.
2) Z-кадровый буфер с прикрепленной текстурой глубины.
После того, как я рендерил сцену в объект цветного кадрового буфера, я затем переключаюсь на объект буфера глубины и могу успешно отрендерить его (на выходе получается текстура глубины GL_LUMINANCE).
Я могу успешно получить доступ к любому заданному уровню mipmap, выбрав его до рисования буфера глубины, например, я могу отобразить уровень mipmap 3 следующим образом:
// FBO setup - all buffer objects created successfully and are complete and the color
// framebuffer has been rendered to (it has a depth renderbuffer attached), and no
// OpenGL errors are issued:
glBindFramebuffer(GL_READ_FRAMEBUFFER, _fbo_color);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo_z);
glBlitFramebuffer(0,0,_w, _h, 0, 0, _w, _h, GL_DEPTH_BUFFER_BIT, GL_NEAREST);
glGenerateMipmap(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// This works:
// Select mipmap level 3
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 3);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);
draw_depth_texture_on_screen_aligned_quad();
// Reset mipmap
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000);
В качестве альтернативы я хотел бы добавить параметр смещения в функцию GLSL texture2D () или использовать texture2DLod () и работать с одним сэмплером текстуры, но всякий раз, когда я выбираю уровень выше 0, создается впечатление, что Мип-карта не была сгенерирована:
// fragment shader (Both texture2DLod and texture2D(sampler, tcoord, bias)
// are behaving the same.
uniform sampler2D zbuffer;
uniform int mipmap_level;
void main()
{
gl_FragColor = texture2DLod(zbuffer, gl_TexCoord[0].st, float(mipmap_level));
}
Я не уверен, как mipmapping работает с glBlitFramebuffer (), но мой вопрос в том, как правильно настроить программу так, чтобы вызовы, сделанные в texture2D / texture2DLod, давали ожидаемые результаты?
Спасибо, Деннис