Правильное распределение памяти для текстур в GL_TEXTURE_2D_ARRAY
Предположим, у меня есть GL_TEXTURE_2D_ARRAY, включая 6 текстур, с которыми я загружаю его:
vector<string>::iterator vsit;
for(vsit=filenameTable.begin();vsit!=filenameTable.end();++vsit)
{
string filename = *vsit;
BMPData* bmpData = LoadTextureBMPData_custom(filename);
glTexSubImage3D(GL_TEXTURE_2D_ARRAY,0,0,0,i++,bmpData->width,bmpData->height,1,GL_BGR,GL_UNSIGNED_BYTE,(GLvoid*)&(bmpData->data[0]));
}
Перед этим кодом я должен выделить память для каждой текстуры, если я хорошо понимаю, я могу сделать это с помощью glTexImage3D() или glTexStorage3D(), например:
glTexImage3D(GL_TEXTURE_2D_ARRAY,0,GL_RGB,1024,1024,filenameTable.size(),0,GL_BGR,GL_UNSIGNED_BYTE,NULL);
или же
glTexStorage3D(GL_TEXTURE_2D_ARRAY,0,GL_RGB,1024,1024,filenameTable.size());
================================================== ============================== Но когда я выделяю размер для каждой текстуры в таблице, у меня есть только одна пара параметров для [width Высота текстуры. Что если я хочу, чтобы каждое изображение текстуры имело другие размеры? Есть ли решение этой проблемы без масштабирования каждой текстуры до одного размера в графическом редакторе?
Другая проблема заключается в том, что glTexStorage3D () я представляю на третьем фрагменте кода, вызывающем сбой моей программы. Информацию о glTexStorage3D () я нашел там:
http://www.opengl.org/wiki/Array_Texture
2 ответа
Что ж, если вам не нужно тратить память, вы можете использовать самое большое изображение (отдельно для каждого димесайона), чтобы определить размер TA. Вы можете загрузить каждое изображение отдельно в слой, используя glTexSubImage3D
, Вам нужно будет изменить текстовые координаты при доступе к текстурам, так что ваш шейдер должен знать размер каждого изображения в массиве, к которому он должен получить доступ. Вы также должны знать, что встроенная функция переноса не может использоваться и должна быть эмулирована в шейдере (при необходимости).
Все изображения в массиве текстуры имеют одинаковый размер. Так же, как если вы создаете массив C некоторой структуры, каждая структура должна быть одного типа (и, следовательно, одного размера).