如何从立方体纹理中检索 6 个面
How to retreive the 6 faces from cube texure
我解析的TGA贴图文件应该是GL_TEXTURE_CUBE_MAP
char* pixelsArray = LoadTGA(getPath(), &width, &height, &bpp);
而且我不知道如何检索立方体的 6 个面。
我试图获取 pixelsArray 和面孔的一些相关索引。
类似于:
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);
纹理创建不是我想要的。 (它绘制了一些奇怪的像素)
为了回答您的问题,您的加载程序需要将 6 sub-faces 复制到一个单独的数组中,并将每个提取的 sub-image 上传到 glTexImage2D()
。
更好的答案是 "why are you doing it this way"?您的 TGA 包含大量浪费 space,并且 TGA 是一种未压缩格式。这意味着您拥有较大的安装尺寸和较高的内存带宽。拆分出 6 个面 off-line,压缩它们并将它们映射到例如ASTC 或 ETC 格式。如果你想避免在磁盘上处理大量文件,你可以将它们存储在 KTX 包装器格式中。
我解析的TGA贴图文件应该是GL_TEXTURE_CUBE_MAP
char* pixelsArray = LoadTGA(getPath(), &width, &height, &bpp);
而且我不知道如何检索立方体的 6 个面。
我试图获取 pixelsArray 和面孔的一些相关索引。 类似于:
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);
纹理创建不是我想要的。 (它绘制了一些奇怪的像素)
为了回答您的问题,您的加载程序需要将 6 sub-faces 复制到一个单独的数组中,并将每个提取的 sub-image 上传到 glTexImage2D()
。
更好的答案是 "why are you doing it this way"?您的 TGA 包含大量浪费 space,并且 TGA 是一种未压缩格式。这意味着您拥有较大的安装尺寸和较高的内存带宽。拆分出 6 个面 off-line,压缩它们并将它们映射到例如ASTC 或 ETC 格式。如果你想避免在磁盘上处理大量文件,你可以将它们存储在 KTX 包装器格式中。