在GL_TEXTURE_2D_ARRAY中更正纹理的存储分配

时间:2013-07-20 08:08:31

标签: opengl texturing

假设我有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

2 个答案:

答案 0 :(得分:3)

数组纹理中的所有图像都具有相同的大小。就像你创建一个结构的C数组一样,每个结构必须是相同的类型(因此大小相同)。

答案 1 :(得分:2)

好吧,如果你不关心浪费记忆,你可以使用最大的图像(每个尺寸分开)来定义TA的大小。您可以使用glTexSubImage3D将每个图像分别加载到图层中。但是,在访问纹理时,您必须修改texcoords,因此着色器需要知道它需要访问的数组中每个图像的大小。您还应该知道内置包装功能无法使用,必须在着色器中进行模拟(如果需要)。