如何从立方体纹理中检索 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 包装器格式中。