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

4

Решение

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

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

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

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

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

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]