Правильное распределение памяти для текстур в 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);

or

glTexStorage3D(GL_TEXTURE_2D_ARRAY,0,GL_RGB,1024,1024,filenameTable.size());

================================================== ============================== Но когда я выделяю размер для каждой текстуры в таблице, у меня есть только одна пара параметров для [width ,высота] текстуры. Что, если я хочу, чтобы каждое изображение текстуры имело другие размеры? Есть ли решение этой проблемы без масштабирования каждой текстуры до одного размера в графическом редакторе?

Другая проблема заключается в том, что glTexStorage3D(), которую я представляю на третьем фрагменте кода, вызывает сбой моей программы. Информацию о glTexStorage3D() я нашел здесь:
http://www.opengl.org/wiki/Array_Texture


person CppMonster    schedule 20.07.2013    source источник


Ответы (2)


Что ж, если вы не заботитесь о пустой трате памяти, вы можете использовать самое большое изображение (отдельное для каждого измерения), чтобы определить размер ТА. Вы можете загрузить каждое изображение отдельно в слой, используя glTexSubImage3D. Однако вам придется изменить texcoords при доступе к текстурам, поэтому ваш шейдер должен знать размер каждого изображения в массиве, к которому он должен получить доступ. Вы также должны знать, что встроенная функция переноса не может быть использована и должна эмулироваться в шейдере (при необходимости).

person derhass    schedule 20.07.2013

Все изображения в текстуре массива имеют одинаковый размер. Точно так же, как если вы создаете массив C из некоторой структуры, каждая структура должна быть одного типа (и, следовательно, одного размера).

person Nicol Bolas    schedule 20.07.2013
comment
Хорошо, это просто моя проблема: есть ли возможность сохранить мои растровые файлы с неизменным размером, используя glTexImage3D() или glTexStorage3D() аналогичным образом. Моя цель — сделать код текстуры гибким. Может быть, мне нужно сделать это по-другому или с другими функциями? - person CppMonster; 20.07.2013