【问题标题】:storage of mipmaps in OpenGL在 OpenGL 中存储 mipmap
【发布时间】:2022-11-04 01:46:07
【问题描述】:

OpenGL 版本 450 引入了一个新函数,可用于为纹理 2D 分配内存:

glTextureStorage2D(textureObj,levels,internal_format,width,height);
//here, parameter 'levels' refers to the levels of mipmaps
//we need to set it 1 if we only want to use the original texture we loaded because then there is only one mipmap level 

而且,还有一个函数可以帮助我们方便地为纹理生成 mipmap:

glGenerateTextureMipmap(textureObj);

所以,我有一个问题:当我使用glTextureStorage2D时我需要指定存储的大小,我是否需要为以后使用glGenerateTextureMipmap保留额外的空间,因为mipmap需要额外的内存? 我知道我可以使用 glTexImage2D 来避免这个问题,我可以先将纹理绑定到目标 GL_TEXTURE_2D,然后使用 glTexImage2D 将图像的数据复制到纹理的内存中,它只要求我给出目标 mipmap 级别而不是 mipmap 的数量级别,最后使用 glGenerateMipmap(GL_TEXTURE_2D)。

我对 glGenerateMipmap 有点困惑。它会为生成的 mipmap 级别分配额外的空间吗?

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    “保留额外的内存”是什么意思?当你使用glTextureStorage2D 时,你告诉 OpenGL 你想要多少个 mipmap。谈到immutable storage,你不会食言。如果您说纹理具有宽度 W、高度 H 和 mipmap 计数 L,那么这就是该纹理所具有的。永远。

    因此,glGenerateTextureMipmaps 只会为您放入纹理的 mipmap 数量(减去基本级别)生成数据。

    【讨论】:

    • 当我使用glTextureStorage2D时,当我指定这个纹理的级别和大小时,OpenGL然后根据宽度、高度和级别分配内存?
    • 而且,“减去基本水平”是什么意思?基础等级不总是0级吗?就是我调用glTextureStorage2D后,函数glGenerateTextureMipmaps只会根据glTextureStorage2D分配的内存大小生成mipmap。我以为是当我调用glGenerateTextureMipmaps时,opengl会生成所有级别的纹理并腾出额外的空间来存储这些mipmap。
    • @SZYoo:“而且,“减去基本水平”是什么意思?" 这意味着glGenerateTextureMipmaps 不会生成基本 mipmap 级别,因为......这没有任何意义。基本级别是 mipmap 级别,所以如果它是“纹理的所有级别”将包括基础水平。所以它会生成你放入纹理的 mipmap 的数量,除了基本级别。
    • 如果我使用glTexImage2D,我不需要告诉OpenGL我想为这个纹理生成mipmap,但是我仍然可以稍后调用glGenerateMipmap来为它生成mipmap。由于生成 mipmap 时需要更大的内存,因此在这种情况下,OpenGL 可以在我调用 glTexImage2D 时为该纹理的 mipmap 保留额外空间,或者仅在我对该纹理调用 glGenerateMipmap 时分配额外空间。或者两者都不是真的。我不知道这里会发生什么。你能给我解释一下吗?谢谢! :)
    • 关于“生成 mipmap”的含义似乎有些混乱。 Mipmap 级别可以存在,但它们也有特定的内容(纹素)。对于不可变的存储纹理,存在的 mipmap 级别的数量是在分配纹理的存储空间时确定的。在这样的纹理上调用glGenerate*Mipmaps 将通过缩小基础mipmap 中的纹素数据来为这些mipmap 生成纹素数据。对于可变纹理,该函数还将为所有 mipmap 级别 specified by the mipmap range 分配存储空间。
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2011-01-17
    相关资源
    最近更新 更多