【问题标题】:Is it possible to write into specific mipmap level in fragment shader?是否可以在片段着色器中写入特定的 mipmap 级别?
【发布时间】:2019-06-24 22:41:06
【问题描述】:

我创建了一个经典的 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;

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:

    是的,使用函数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,也可以发送原始纹理,并在片段着色器中对其进行修改。

    【讨论】:

    • 感谢您的回复。这种方法在创建 mipmap 并使用 c++ 时会写入它们。是否可以在片段着色器中修改自动生成的 mipmap? (更新了我的问题)
    • "(当然你需要一个渲染缓冲区和一个帧缓冲区)。"为什么?在这种情况下,绝对不需要使用渲染缓冲区(或深度缓冲区)。
    • @derhass 我已经编辑了答案,如果还有其他内容,请编辑或告诉我:)
    • 谢谢,稍作调整,我就成功生成了 mipmap,甚至修改了着色器中的纹理过滤。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多