Можно ли записать в определенный уровень MIPMAP во фрагментном шейдере? - PullRequest
2 голосов
/ 24 июня 2019

Я создал классическую 2D текстуру и визуализировал ее в некоторых значениях, в моем случае глубину. В коде c ++ я использую функцию glGenerateMipmap() для автоматического создания мипмапов. Во фрагментном шейдере я могу получить доступ к текстуре, как обычная форма sampler2D, и мне хотелось бы записать в данный уровень mipmap, в частности, я хочу вычислить значения на уровне r + 1, в соответствии со значениями на уровне r, и записать в него , Есть ли полезный инструмент для достижения этой цели? Использование GLSL 4.30

Например:

// That's how I get the value, I need some kind of method to set
float current_value = textureLod(texture, tex_coords, MIP_LVL).y;

1 Ответ

4 голосов
/ 24 июня 2019

Да, используйте функцию glFramebufferTexture2D и в последнем параметре укажите уровень mipmap.

После того, как вы вложили все, что вам нужно, визуализируйте изображение, которое вы хотите, на конкретном mipmap.

Примечание. Не забудьте изменить значение на glViewport, чтобы оно отображалось с соответствующим размером mipmap!

Вот простой пример:

unsigned int Texture = 0;
int MipmapLevel = 0;
glGenFramebuffers(1, &FBO);
glGenRenderbuffers(1, &RBO);
glGenTextures(1, &Texture);

glBindTexture(GL_TEXTURE_2D, Texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, TextureWidth, TextureHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
// glTexParameteri here

// Use shader and setup uniforms

glViewport(0, 0, TextureWidth, TextureHeight);

glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glBindRenderbuffer(GL_RENDERBUFFER, RBO);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, TextureWidth, TextureHeight);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Texture, MipmapLevel); // Here, change the last parameter to the mipmap level you want to write to
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Render to texture

// Restore all states (glViewport, Framebuffer, etc..)

EDIT:

Если вы хотите изменить сгенерированный mipmap (созданный с помощью glGenerateMipmap или извне), вы можете использовать тот же метод, использовать glFramebufferTexture2D и выбрать mipmap, который хотите изменить.

После того, как вы выполнили все настройки (как в примере выше), вы можете либо полностью отрендерить новый mipmap, либо отправить исходную текстуру и изменить ее в фрагментном шейдере.

...