我有一个关于OpenGL纹理数组的简单(我认为)问题。我使用以下内容创建我的纹理数组:
glTexImage3D( GL_TEXTURE_2D_ARRAY,
0,
formatGL,
width,
height,
slices,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
nullptr);
请注意,我不想实际加载任何图像。我只是创建了稍后我将填充数据的结构。
所以我的问题是:
如何为纹理数组的每个“切片”生成mip链?我不想在物理上生成mip,我只想通过告诉mip来完成纹理。我只需通过调用mip级别,大小的glTexImage2D函数并传入nullptr就可以使用2D纹理。鉴于没有“切片”参数,我无法看到如何使用glTexImage3D函数执行此操作。 OpenGL的可操作示例仅将.bmp加载到数组中每个纹理的第一个mip级别。说使用glTexSubImage3D,传入nullptr,是否会为数组中的给定纹理创建我想要的mip级别是正确的吗?
关于glGenerateMipMap的khronos.org上的文档仅指定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++;
}
答案 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
。