Создание уровней MIP для массива 2D-текстур - PullRequest
2 голосов
/ 01 октября 2011

У меня простой (я думаю) вопрос о текстурных массивах OpenGL.Я создаю свой массив текстур следующим образом:

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

Обратите внимание, что я пока не хочу загружать в него изображения.Я просто создаю структуру, которую позже буду заполнять данными.

Итак, мои вопросы:

  1. Как создать цепочку mip для каждого«кусок» массива текстур?Я не хочу физически создавать мип, я просто хочу закончить текстуру, рассказав о мипе.Я могу сделать это с 2D текстурами, просто вызвав функцию glTexImage2D с уровнем mip, размером, а также передав nullptr.Я не могу понять, как это сделать с помощью функции glTexImage3D, поскольку там нет параметра «слайс».Пример Superbible OpenGL загружает только .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++;
    }

1 Ответ

3 голосов
/ 01 октября 2011

Я могу сделать это с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...