Я оборачиваюсь вокруг создания на лету мипмапов и читаю этот бит с помощью следующего кода: http://www.g-truc.net/post-0256.html
//Create the mipmapped texture
glGenTextures(1, &ColorbufferName);
glBindTexture(ColorbufferName);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_UNSIGNED_BYTE, NULL);
glGenerateMipmap(GL_TEXTURE_2D); // /!\ Allocate the mipmaps /!\
...
//Create the framebuffer object and attach the mipmapped texture
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ColorbufferName, 0);
...
//Commands to actually draw something
render();
...
//Generate the mipmaps of ColorbufferName
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ColorbufferName);
glGenerateMipmap(GL_TEXTURE_2D);
Мои вопросы:
glGenerateMipmap
должен быть вызван дважды в случае рендеринга в текстуру? Если я, например, импортирую диффузную 2d текстуру, мне нужно вызвать ее только один раз после загрузки в OpenGL следующим образом:
GLCALL(glGenTextures(1, &mTexture));
GLCALL(glBindTexture(GL_TEXTURE_2D, mTexture));
GLint format = (colorFormat == ColorFormat::COLOR_FORMAT_RGB ? GL_RGB : colorFormat == ColorFormat::COLOR_FORMAT_RGBA ? GL_RGBA : GL_RED);
GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, format, textureWidth, textureHeight, 0, format, GL_UNSIGNED_BYTE, &textureData[0]));
GLCALL(glGenerateMipmap(GL_TEXTURE_2D));
GLCALL(glBindTexture(GL_TEXTURE_2D, 0));
Я подозреваю, что это потому, что текстуры перерисовываются каждый кадр, и поколение mipmap использует свой контент в процессе, но я хочу подтверждения этого.
3 — Кроме того, если я сделаю рендеринг в свой gbuffer и сразу glBlitFramebuffer
это по умолчанию FBO, мне нужно связать и glGenerateMipmap
как это?
GLCALL(glBindTexture(GL_TEXTURE_2D, mGBufferTextures[GBuffer::GBUFFER_TEXTURE_DIFFUSE]));
GLCALL(glGenerateMipmap(GL_TEXTURE_2D));
GLCALL(glReadBuffer(GL_COLOR_ATTACHMENT0 + GBuffer::GBUFFER_TEXTURE_DIFFUSE));
GLCALL(glBlitFramebuffer(0, 0, mWindowWidth, mWindowHeight, 0, 0, mWindowWidth, mWindowHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR));
Как объясняется в посте, на который вы ссылаетесь, «[glGenerateMipmap
] фактически делает две вещи, что, возможно, является единственной проблемой: выделяет память mipmaps и генерирует mipmaps. «
Обратите внимание на то, что предшествует первому glGenerateMipmap
вызов glTexImage2D
вызов с указателем данных NULL. Эти два вызова объединят просто выделение памяти для всех уровней текстуры. Данные, которые они содержат на данный момент, являются мусором.
Как только вы загрузите изображение на первый уровень текстуры, вам нужно будет вызвать glGenerateMipmap
второй раз, чтобы фактически заполнить меньшие уровни изображениями с пониженной дискретизацией.
Ваше предположение верно, glGenerateMipmap
вызывается каждый кадр, потому что изображение, отображаемое на первый уровень текстуры, меняет каждый кадр (так как оно отображается). Если вы не вызовете функцию, меньшие мипмапы никогда не будут изменены (если вы отобразите такую текстуру, вы увидите неинициализированные меньшие уровни мипмапов, когда будете достаточно далеко).
Нет. Мип-карты нужны только в том случае, если вы хотите отобразить текстуру в треугольники в режиме фильтрации текстур, в котором используются мип-карты. Если вы имеете дело только с первым уровнем текстуры, вам не нужно создавать мипмапы. Фактически, если вы никогда не отображаете текстуру, вы можете использовать рендер-буфер вместо текстуры в фрейм-буфере.
Других решений пока нет …