OpenGL glGeneratemipmap и кадровые буферы

Я оборачиваюсь вокруг создания на лету мипмапов и читаю этот бит с помощью следующего кода: 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);

Мои вопросы:

  1. Почему glGenerateMipmap должен быть вызван дважды в случае рендеринга в текстуру?
  2. Должен ли он называться так каждый кадр?

Если я, например, импортирую диффузную 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));

1 ответ

Решение
  1. Как объясняется в посте, на который вы ссылаетесь, "[glGenerateMipmap] фактически делает две вещи, что, возможно, является единственной проблемой: выделяет память mipmaps и генерирует mipmaps."

    Обратите внимание на то, что предшествует первому glGenerateMipmap вызов glTexImage2D вызов с указателем данных NULL. Эти два вызова объединят просто выделение памяти для всех уровней текстуры. Данные, которые они содержат на данный момент, являются мусором.

    Как только вы загрузите изображение на первый уровень текстуры, вам нужно будет вызвать glGenerateMipmap второй раз, чтобы фактически заполнить меньшие уровни изображениями с пониженной дискретизацией.

  2. Ваше предположение верно, glGenerateMipmap вызывается каждый кадр, потому что изображение, отображаемое на первый уровень текстуры, меняет каждый кадр (так как оно отображается). Если вы не вызовете функцию, меньшие мип-карты никогда не будут изменены (если вы отобразите такую ​​текстуру, вы увидите неинициализированные меньшие уровни мип-карт, когда будете достаточно далеко).

  3. Нет. Мип-карты нужны только в том случае, если вы хотите отобразить текстуру в треугольники в режиме фильтрации текстур, в котором используются мип-карты. Если вы имеете дело только с первым уровнем текстуры, вам не нужно создавать мипмапы. Фактически, если вы никогда не отображаете текстуру, вы можете использовать рендер-буфер вместо текстуры в фрейм-буфере.

Другие вопросы по тегам