生成2D纹理数组的mip级别

时间:2011-09-30 22:17:18

标签: opengl textures

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

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

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

所以我的问题是:

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

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

  3. 以下是我使用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++;
        }
    

1 个答案:

答案 0 :(得分:3)

  

我只需通过调用mip级别,大小的glTexImage2D函数并传入nullptr,就可以使用2D纹理。鉴于没有“切片”参数,我无法看到如何使用glTexImage3D函数执行此操作。

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

实际上,两个函数之间仅 的区别在于它们所采用的维数(因此可能是target个参数)。还有一个“切片”参数;你在向我们展示的电话中使用了glTexImage3D。在那里,它被称为depth

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

  

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