opengl - 为 2D 纹理数组生成 mip 级别

标签 opengl textures

我有一个关于 OpenGL 纹理数组的简单(我认为)问题。我使用如下内容创建纹理数组:

glTexImage3D(   GL_TEXTURE_2D_ARRAY,
        0,
        formatGL,
        width,
        height,
        slices,
        0,
        GL_RGBA, 
        GL_UNSIGNED_BYTE, 
        nullptr);

请注意,我还不想实际加载任何图像。我只是创建稍后将填充数据的结构。

所以我的问题是:

  1. 如何为纹理数组的每个“切片”生成 mip 链?我不想物理生成 mip,我只想通过告诉它有关 mip 的信息来完成纹理。我可以使用 2D 纹理来完成此操作,只需使用 mip 级别、大小并传入 nullptr 调用 glTexImage2D 函数即可。由于没有“切片”参数,我不知道如何使用 glTexImage3D 函数来执行此操作。 OpenGL super 示例仅将 .bmp 加载到数组中每个纹理的第一个 mip 级别。使用 glTexSubImage3D 并传入 nullptr 将为数组中的给定纹理创建我想要的 mip 级别,这样说是否正确?

  2. khronos.org 上有关 glGenerateMipMap 的文档仅指定 GL_TEXTURE_2D 或 GL_TEXTURE_CUBE_MAP。那么我不能对 2D 纹理数组使用此方法是否正确?

以下是我使用 2D 纹理创建 mip 链的方法:

    size_t i = 0, mipSizeX = width, mipSizeY = height;

    while(mipSizeX >= 1 || mipSizeY >= 1)
    {
        // Generate image for this mip level

        glTexImage2D(   GL_TEXTURE_2D,
                        i,
                        formatGL,
                        mipSizeX,
                        mipSizeY,
                        0,
                        GL_RGBA, 
                        GL_UNSIGNED_BYTE, 
                        nullptr);

        // Go to the next mip size.

        mipSizeX >>= 1;
        mipSizeY >>= 1;

        // and the next mipmap level.

        i++;
    }

最佳答案

I can do this with 2D textures simply by calling the glTexImage2D function with the mip level, size and also passing in a nullptr. I can't see how to do this with the glTexImage3D function given there's no "slice" parameter.

为什么不呢? glTexImage3D 采用 mipmap 级别,就像 glTexImage2D 一样。它需要一个大小,在 2D 中是二维,但在 3D 中是三个维度。

事实上,两个函数之间的唯一区别在于它们所采用的维度数(以及可能的 target 参数)。并且有一个“slice”参数;您在向我们展示的通话中将其与 glTexImage3D 一起使用。在那里,它被称为 depth .

3D 纹理和 2D 数组纹理之间的区别在于 depth对于 2D 数组,较低的 mipmap 不会发生变化。数组中的每个 mipmap 都具有与其他每个 mipmap 相同数量的“切片”。

Documentation at khronos.org

如果它位于“khronos.org”而不是“opengl.org”,那么它几乎肯定是在谈论 OpenGL ES,它没有数组纹理(稍后注意: ES 3.0添加了数组纹理)。


老实说,如果不实际为您编写代码,我不知道如何才能更清楚。

size_t i = 0, mipSizeX = width, mipSizeY = height;

while(mipSizeX >= 1 || mipSizeY >= 1)
{
    // Generate image for this mip level

    glTexImage3D(   GL_TEXTURE_2D_ARRAY,
                    i,
                    formatGL,
                    mipSizeX,
                    mipSizeY,
                    arrayCount,
                    0,
                    GL_RGBA, 
                    GL_UNSIGNED_BYTE, 
                    nullptr);

    // Go to the next mip size.

    mipSizeX >>= 1;
    mipSizeY >>= 1;

    // and the next mipmap level.

    i++;
}

此外,您需要检查 mipmap 大小的最小值是否为 1。因为 (1 >> 1) == 0 .

关于opengl - 为 2D 纹理数组生成 mip 级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7616632/

相关文章:

c++ - OpenGL:二维四边形应该如何存储/渲染?

objective-c - NSOpenGLPFAColorSize 对于 NSOpenGLPixelFormat 的含义

opengl - OpenGL 4.3 中矩形纹理真的需要 GL_ARB_TEXTURE_RECTANGLE 扩展吗?

android - 在着色器上使用多个 SurfaceTexture

c++ - 2 QOpenGLWidget共享上下文导致崩溃

java - 如何将 OpenGL 上下文放入我当前的线程中,未找到 opengl 上下文

c - 使用 `const` 中断程序

three.js - 将纹理应用于三个 js 模型时出现奇怪的线条 ("seams")

c - OpenGL 仅在使用多个纹理四边形时纹理坐标不正确

c# - 渲染时纹理显示为灰色