是否可以在片段着色器中写入特定的Mipmap级别?

时间:2019-06-24 09:06:50

标签: c++ opengl glsl

在我的情况下,我已经创建了经典的2D纹理,并渲染为一些值。在c ++代码中,我使用glGenerateMipmap()函数自动生成mipmap。在片段着色器中,我可以访问纹理,就像普通的sampler2D制服一样,我想写入给定的mipmap级别,特别是我想根据r级别的值来计算r + 1级别的值,并将其写入。有一些有用的工具可以实现这一目标吗?使用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 个答案:

答案 0 :(得分:4)

是的,使用函数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..)

编辑:

如果要修改生成的mipmap(使用glGenerateMipmap或从外部生成),则可以使用相同的方法,使用glFramebufferTexture2D并选择要修改的mipmap。

完成所有设置工作后(如上述示例),您可以完全渲染新的mipmap,也可以发送原始纹理并在片段着色器中对其进行修改。