Я могу сделать это с 2D-текстурами, просто вызвав функцию glTexImage2D с уровнем mip, размером, а также передав nullptr. Я не могу понять, как это сделать с помощью функции glTexImage3D, поскольку в ней нет параметра «slice».
Почему бы и нет? glTexImage3D принимает уровень mipmap, как и glTexImage2D. Требуется размер, который в 2D - это два измерения, а в 3D - это три измерения.
Действительно, разница между двумя функциями only является количеством измерений, которые они принимают (и, следовательно, возможных параметров target
). И есть параметр «срез»; вы использовали его с glTexImage3D в звонке, который вы нам показали. Там он называется depth
.
Разница между 3D-текстурами и текстурами 2D-массивов заключается в том, что depth
не изменяется в нижних мип-картах для 2D-массивов. Каждый 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++;
}
Кроме того, вам нужно проверить, чтобы размеры мип-карт имели минимальное значение 1. Потому что (1 >> 1) == 0
.