【问题标题】:What is the proper way to generate mipmaps生成 mipmap 的正确方法是什么
【发布时间】:2013-10-06 07:32:11
【问题描述】:

在最近的教程中,我遇到了这个为“textureObject”生成 mipmaps

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureObject);
glBindSampler(0, samplerObject);
glGenerateMipmap(GL_TEXTURE_2D);

我想质疑一下

的用法
glActiveTexture(GL_TEXTURE0);
glBindSampler(0, samplerObject);

在调用“glGenerateMipmap”之前。因为我得到的结果和以前一样,如果我注释掉这两行。

这些行是否只是为了确保在生成 mipmap 之前绑定了正确的纹理单元和采样器?

或 这些行实际上告诉了要选择哪个纹理单元以及要进行什么样的采样来生成 mipmap?

如果我跳过这两行会发生什么?

【问题讨论】:

    标签: opengl textures


    【解决方案1】:

    来自glGenerateMipmap reference

    指定将生成mipmap的纹理对象绑定到的活动纹理单元的纹理目标

    还有更多

    Mipmap 生成将 texel 数组级别级别 base + 1 到 q 替换为从级别基础数组派生的数组,而不管它们之前的内容如何。所有其他 mimap 数组,包括级别基础数组,在此计算中保持不变。

    这样,如果你使用

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, textureObject);
    glActiveTexture(GL_TEXTURE1); // <<
    glGenerateMipmap(GL_TEXTURE_2D);
    

    您将获得不同纹理对象的 mipmap(如果纹理单元 1 绑定了其他纹理对象)

    关于采样器:它们可以覆盖GL_TEXTURE_BASE_LEVEL​ 和GL_TEXTURE_MAX_LEVEL​,因此使用合适的采样器对象也很重要。

    看好post from g-truck about mipmaps

    【讨论】:

    • 这已经是 g-truc 的一个例子了。 gl-330-fbo-mipmaps.cpp。该教程在生成 mipmap 之前绑定了纹理单元 0 和采样器。
    • 对!我已经改变了答案,所以希望它会更好。
    • mipmap 生成是否需要有关采样/纹理参数的任何信息(如 GL_TEXTURE_LOD_BIAS、GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、GL_TEXTURE_MIN_LOD)?因为如果没有,那么我认为可以安全地假设我们不需要绑定采样器。关于纹理单元:我之所以问是否需要选择一个活动的纹理单元是因为我们知道,当我们为其分配图像或指定纹理参数时,该纹理已经绑定到纹理单元 0。那么我们在生成mipmaps时是否必须再次指定它?
    • 你又是对的。 opengl.org/wiki/Sampler_Object。 Sampler 有 GL_TEXTURE_BASE_LEVEL​ 和 GL_TEXTURE_MAX_LEVEL​ 参数将被 glGenerateMipmap 使用,因此这意味着 Sampler 也很重要。我不认为使用过滤参数...可能 mipmap 生成依赖于实现。
    猜你喜欢
    • 2021-05-23
    • 2020-12-16
    • 1970-01-01
    • 2023-02-08
    • 2018-02-08
    • 1970-01-01
    • 2020-11-05
    • 2021-04-05
    • 2021-07-26
    相关资源
    最近更新 更多