1

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

4

2 回答 2

3

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

于 2013-07-20T08:27:58.867 回答
2

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

于 2013-07-20T13:02:12.683 回答