【问题标题】:Updating OpenGL mipmapped texture更新 OpenGL mipmaped 纹理
【发布时间】:2013-04-23 09:38:13
【问题描述】:

关于 OpenGL 中的纹理更新,我无法完全理解。假设我使用这样的 mipmap 创建 OpenGL 纹理:

        ///.. tex gen and bind here .... ///

        glTexStorage2D(GL_TEXTURE_2D,numMipMapLevels,GL_RGBA8,imageInfo.Width,imageInfo.Height);
        glTexSubImage2D(GL_TEXTURE_2D,0,0,0,Width,Height,GL_BGRA,GL_UNSIGNED_BYTE,data);
        glGenerateMipmap(GL_TEXTURE_2D);

现在第一个问题: 这是否意味着,当我想更新包含所有 mipmap 级别的纹理时,我是否必须遍历每个级别并使用适当的 mipmap 尺寸和图像字节调用 glTexSubImage2D?如果答案是 YES,那么我有:

第二个问题: 如何检索每个 mipmap 维度和数据以传递到纹理中?

或者,我可以直接更新吗:

 glTexSubImage2D(GL_TEXTURE_2D,0,0,0,Width,Height,GL_BGRA,GL_UNSIGNED_BYTE,data);

然后立即重新生成 mipmap?

    glGenerateMipmap(GL_TEXTURE_2D);

【问题讨论】:

    标签: opengl opengl-4


    【解决方案1】:

    回答第一个问题

    是的

    回答第二个问题

    每个 mipmap 级别的宽度和高度正好是其上方 mipmap 级别的一半。因此,对于 mipmap 级别 n,尺寸为 w·2-nh·2-n 其中 wh 是级别 0 的大小。

    它可以通过回忆移位(类似 C 语言中的 >><< 运算符)是 2 个运算符的强大功能来轻松编程。所以 a << n = a·2na >> n = a·2-n

    回答第三个问题

    是的,但是特定 OpenGL 实现使用的缩小过滤器的质量可能无法满足您的需求。

    【讨论】:

    • 好的,每个mipmap的像素数据也应该“修剪”或偏移?
    • @MichaelIV:如果修剪是指 downsampled,那么可以。但是,如果您使用 mipmapping,那么下采样过滤器应该比稀疏框或线性采样要好得多,因为您可以使用 GL_NEAREST 或 GL_LINEAR 免费获得它。为获得最佳视觉质量,您应该使用 Lancosz(又名 sinc)滤波器对原始信号进行下采样。
    • @datenwolf 你有任何截图比较视觉质量与或没有正弦滤波器(在这两种情况下使用 GL_LINEAR_MIPMAP_LINEAR)。我只是用谷歌搜索,没有找到任何截图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多