Размытие буфера глубины в OpenGL - как получить доступ к уровням MIP-карты во фрагментном шейдере?

Я пытаюсь размыть текстуру глубины, размывая и смешивая уровни MIP-карты во фрагментном шейдере.

У меня есть два объекта фреймбуфера:
1) Цветной фреймбуфер с прикрепленным объектом рендеринга глубины.
2) Фреймбуфер z с прикрепленной текстурой глубины.

Как только я визуализирую сцену в объекте цветного буфера кадра, я затем переходю к объекту буфера глубины и могу успешно его визуализировать (на выходе получается текстура глубины GL_LUMINANCE).

Я могу успешно получить доступ к любому заданному уровню mipmap, выбрав его до рисования буфера глубины, например, я могу визуализировать уровень 3 mipmap следующим образом:

// 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);

В качестве альтернативы я хотел бы добавить параметр bias в функцию GLSL texture2D () или использовать texture2DLod () и работать с одним сэмплером текстуры, но всякий раз, когда я выбираю уровень больше 0, оказывается, что mipmap не содержит не было создано:

// 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 давали ожидаемые результаты?

Спасибо, Деннис


person Dennis Ward    schedule 18.06.2010    source источник
comment
Каковы ожидаемые результаты? Как вы думаете, почему MIP-карта не сгенерирована? Разместите несколько скриншотов в качестве примеров.   -  person Dr. Snoopy    schedule 18.06.2010
comment
Матиас - Я в основном пытаюсь выполнить то же самое, что показано в OpenGL superbible (4-е изд.) О цветении / послесвечении, но для немного другой цели. Я мог бы опубликовать изображение своего экрана, но мне пришлось бы настроить для этого какой-то хостинг, а поскольку я ленив, я не хочу этого делать. Если у вас есть способ лучше, чем я описал в своем ответе, дайте мне знать. Спасибо!   -  person Dennis Ward    schedule 18.06.2010


Ответы (1)


Хорошо - я думаю, что понял ... В моем буфере глубины не были сгенерированы уровни mipmap. Я использую мульти-текстурирование, и во время рендеринга я активирую блок текстуры 0 для текстуры цветного буфера кадра и блок текстуры 1 для текстуры буфера глубины. Когда я активирую / привязываю текстуры, я вызываю glGenerateMipmap (GL_TEXTURE_2D) следующим образом:

glActiveTextureARB(GL_TEXTURE0_ARB);
glBindTexture(GL_TEXTURE_2D, _color_texture);
glGenerateMipmap(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1_ARB);
glBindTexture(GL_TEXTURE_2D, _zbuffer_texture);
glGenerateMipmap(GL_TEXTURE_2D);

Когда это будет сделано, увеличение смещения в texture2D (выборка, координаты, смещение) даст фрагменты с уровня MIP-карты, как и ожидалось.

person Dennis Ward    schedule 18.06.2010
comment
Значит, ошибка заключалась в том, что MIP-карты не создавались с правильными текстурами, верно? - person Dr. Snoopy; 18.06.2010
comment
Да - я не создавал MIP-карты для текстур. Еще раз спасибо за ваш вклад! - person Dennis Ward; 19.06.2010