假设我有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());
=============================================== ================================= 但是当我为表中的每个纹理分配大小时,我只有一对参数 对于纹理的[宽度,高度]。如果我希望每个纹理图像都有另一个调光怎么办?如果没有在图形编辑器中将每个纹理缩放到一个尺寸,是否有解决此问题的方法?
另一个问题是glTexStorage3D()我在第三个代码片段上呈现的事实导致我的程序崩溃。有关glTexStorage3D()的信息我在那里找到:
http://www.opengl.org/wiki/Array_Texture
答案 0 :(得分:3)
数组纹理中的所有图像都具有相同的大小。就像你创建一个结构的C数组一样,每个结构必须是相同的类型(因此大小相同)。
答案 1 :(得分:2)
好吧,如果你不关心浪费记忆,你可以使用最大的图像(每个尺寸分开)来定义TA的大小。您可以使用glTexSubImage3D
将每个图像分别加载到图层中。但是,在访问纹理时,您必须修改texcoords,因此着色器需要知道它需要访问的数组中每个图像的大小。您还应该知道内置包装功能无法使用,必须在着色器中进行模拟(如果需要)。