Размытие буфера глубины в OpenGL - как получить доступ к уровням mipmap во фрагментном шейдере? - PullRequest
3 голосов
/ 18 июня 2010

Я пытаюсь размыть текстуру глубины, размывая и смешивая уровни 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, давали ожидаемые результаты?

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

1 Ответ

3 голосов
/ 18 июня 2010

Хорошо, я думаю, у меня это получилось ... В моем буфере глубины не было сгенерированных уровней 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 (сэмплер, координаты, смещение) дает фрагменты с уровня mipmap, как и ожидалось.

...