假设我有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,height]。如果我希望每个纹理图像都有另一个维度呢?如果不在图形编辑器中将每个纹理缩放到一个大小,有没有解决这个问题的方法?
另一个问题是,我在第三个代码剪切器上展示的glTexStorage3D()导致程序崩溃。我在那里找到了关于glTexStorage3D()的信息:
http://www.opengl.org/wiki/Array_Texture
数组纹理中的所有图像都具有相同的大小。就像您制作某个结构的C数组一样,每个结构必须具有相同的类型(因此大小相同)。
好吧,如果你不在乎浪费内存,你可以使用最大的图像(每个dimesnion都分开)来定义TA的大小。可以使用glTexSubImage3D
将每个图像单独加载到一个层中。不过,在访问纹理时,必须修改纹理坐标,因此着色器需要知道它需要访问的数组中每个图像的大小。您还应该注意,不能使用内置的换行功能,必须在着色器中进行模拟(如果需要)。