我解析应该为GL_TEXTURE_CUBE_MAP的TGA纹理文件
char* pixelsArray = LoadTGA(getPath(), &width, &height, &bpp);
我无法弄清楚如何检索多维数据集的6个面。
我试图获取有关pixelArray和面孔的一些相对索引。 像这样:
newBuffer[rowsIndex * rowSize + columnsIndex] = pixelsArray[rowsIndex*rowSize + imageOffset + rowsIndex*rowSize + columnsIndex]
char * LoadTGA( const char * szFileName, int * width, int * height, int * bpp )
{
FILE * f;
if (fopen_s(&f, szFileName, "rb" ) != 0)
return NULL;
TGA_HEADER header;
fread( &header, sizeof(header), 1, f );
fseek( f, 0, SEEK_END );
int fileLen = ftell( f );
fseek( f, sizeof( header ) + header.identsize, SEEK_SET );
if ( header.imagetype != IT_COMPRESSED && header.imagetype != IT_UNCOMPRESSED )
{
fclose( f );
return NULL;
}
if ( header.bits != 24 && header.bits != 32 )
{
fclose( f );
return NULL;
}
int bufferSize = fileLen - sizeof( header ) - header.identsize;
char * pBuffer = new char[bufferSize];
fread( pBuffer, 1, bufferSize, f );
fclose( f );
*width = header.width;
*height = header.height;
*bpp = header.bits;
char * pOutBuffer = new char[ header.width * header.height * header.bits / 8 ];
switch( header.imagetype )
{
case IT_UNCOMPRESSED:
LoadUncompressedImage( pOutBuffer, pBuffer, &header );
break;
case IT_COMPRESSED:
LoadCompressedImage( pOutBuffer, pBuffer, &header );
break;
}
delete[] pBuffer;
return pOutBuffer;
}
//...buffering texture
GLint width, height, bpp;
GLuint type = GL_TEXTURE_2D, bppType = GL_RGB;
idBuffer = arrayCopy(idBuffer, lastPoint);
glGenTextures(1, idBuffer+lastPoint);
if (!is2D())
type = GL_TEXTURE_CUBE_MAP;
glBindTexture(type, idBuffer[lastPoint]);
char* pixelsArray = LoadTGA(getPath(), &width, &height, &bpp);
if (bpp == 32)
bppType = GL_RGBA;
if (is2D())
glTexImage2D(type, 0, bppType, width, height, 0, bppType, GL_UNSIGNED_BYTE, pixelsArray);
else
for (int face = 0, imageWidth = width / 4, imageHeigth = height / 3; face < 6; face++)
//glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, 0, 0, width, height, bppType, GL_UNSIGNED_BYTE, pixelsArray + face * imageWidth * imageHeigth);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, imageWidth, imageHeigth, bppType, GL_UNSIGNED_BYTE, getBufferForFace(face));
glBindTexture(type, 0);
纹理创建不是我想要的。 (它会绘制一些奇怪的像素)
答案 0 :(得分:0)
要回答您的问题,加载程序将需要将6个子面复制到单独的数组中,并将每个提取的子图像上载到glTexImage2D()
。
一个更好的答案是“为什么要这样做”?您的TGA包含大量浪费的空间,而TGA是未压缩的格式。这意味着您具有较大的安装大小和较高的内存带宽。离线拆分6个面,对其进行压缩并将其Mipmap到例如ASTC或ETC格式。如果要避免处理磁盘上的大量文件,可以将这些文件存储为KTX包装器格式。