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);

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将每个图像单独加载到一个层中。不过,在访问纹理时,必须修改纹理坐标,因此着色器需要知道它需要访问的数组中每个图像的大小。您还应该注意,不能使用内置的换行功能,必须在着色器中进行模拟(如果需要)。

相关内容

  • 没有找到相关文章