Создание мипмапов на основе glBlitFramebuffer и glTexParameteri - PullRequest
0 голосов
/ 13 марта 2020

Мне нужно исправить функцию генерации mipmap на основе FBO / glBlitFramebuffer для GL_TEXTURE_2D_ARRAY. Алгоритм вызывает glTexImage3D для каждого уровня mipmap с постепенно уменьшающимися текстурами, затем инициализирует уровень mipmap 0 каждого слоя с помощью glTexSubImage3D, а затем копирует более мелкие уровни mipmap в более грубые, используя glBlitFramebuffer. Это начало последовательности команд:

glGenTextures(n = 1, textures = &10)
glActiveTexture(texture = GL_TEXTURE7)
glBindTexture(target = GL_TEXTURE_2D_ARRAY, texture = 10)
glTexParameteri(target = GL_TEXTURE_2D_ARRAY, pname = GL_TEXTURE_MAX_LEVEL, param = 8)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 0, internalformat = GL_RGBA8, width = 320, height = 16, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 1, internalformat = GL_RGBA8, width = 160, height = 8, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 2, internalformat = GL_RGBA8, width = 80, height = 4, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 3, internalformat = GL_RGBA8, width = 40, height = 2, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 4, internalformat = GL_RGBA8, width = 20, height = 1, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 5, internalformat = GL_RGBA8, width = 10, height = 1, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 6, internalformat = GL_RGBA8, width = 5, height = 1, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 7, internalformat = GL_RGBA8, width = 2, height = 1, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexImage3D(target = GL_TEXTURE_2D_ARRAY, level = 8, internalformat = GL_RGBA8, width = 1, height = 1, depth = 11, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = NULL)
glTexSubImage3D(target = GL_TEXTURE_2D_ARRAY, level = 0, xoffset = 0, yoffset = 0, zoffset = 10, width = 320, height = 16, depth = 1, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = blob(20480))
glGenFramebuffers(n = 2, framebuffers = {11, 12})
glGetIntegerv(pname = GL_DRAW_FRAMEBUFFER_BINDING, params = &1)
glGetIntegerv(pname = GL_READ_FRAMEBUFFER_BINDING, params = &1)
glBindFramebuffer(target = GL_READ_FRAMEBUFFER, framebuffer = 11)
glBindFramebuffer(target = GL_DRAW_FRAMEBUFFER, framebuffer = 12)
glFramebufferTextureLayer(target = GL_READ_FRAMEBUFFER, attachment = GL_COLOR_ATTACHMENT0, texture = 10, level = 0, layer = 10)
glFramebufferTextureLayer(target = GL_DRAW_FRAMEBUFFER, attachment = GL_COLOR_ATTACHMENT0, texture = 10, level = 1, layer = 10)
glBlitFramebuffer(srcX0 = 0, srcY0 = 0, srcX1 = 320, srcY1 = 16, dstX0 = 0, dstY0 = 0, dstX1 = 160, dstY1 = 8, mask = GL_COLOR_BUFFER_BIT, filter = GL_LINEAR)
glFramebufferTextureLayer(target = GL_READ_FRAMEBUFFER, attachment = GL_COLOR_ATTACHMENT0, texture = 10, level = 1, layer = 10)
glFramebufferTextureLayer(target = GL_DRAW_FRAMEBUFFER, attachment = GL_COLOR_ATTACHMENT0, texture = 10, level = 2, layer = 10)
glBlitFramebuffer(srcX0 = 0, srcY0 = 0, srcX1 = 160, srcY1 = 8, dstX0 = 0, dstY0 = 0, dstX1 = 80, dstY1 = 4, mask = GL_COLOR_BUFFER_BIT, filter = GL_LINEAR)
<continues in this manner for the remaining layers and levels >

По какой-то причине инициализируется только уровень 0 mipmap каждого слоя. Когда я добавляю:

         ::glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER,  GL_LINEAR_MIPMAP_LINEAR);
         ::glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER,  GL_LINEAR);
         ::glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_REPEAT);
         ::glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

перед вызовом glTexImage3D, это похоже на работу. Однако эти параметры фактически устанавливаются позже во время перед вызовом, когда назначается униформа.

Влияет ли какой-либо из этих параметров на команды, используемые для генерации mipmap?

С уважением

Редактировать: :: glTexParameteri (GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); имеет значение. И по какой-то причине он должен быть добавлен до glTexImage3D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...