如何从立方体纹理中恢复6个面

时间:2019-07-06 21:40:07

标签: c++ opengl-es opengl-es-2.0

我解析应该为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);

纹理创建不是我想要的。 (它会绘制一些奇怪的像素)

1 个答案:

答案 0 :(得分:0)

要回答您的问题,加载程序将需要将6个子面复制到单独的数组中,并将每个提取的子图像上载到glTexImage2D()

一个更好的答案是“为什么要这样做”?您的TGA包含大量浪费的空间,而TGA是未压缩的格式。这意味着您具有较大的安装大小和较高的内存带宽。离线拆分6个面,对其进行压缩并将其Mipmap到例如ASTC或ETC格式。如果要避免处理磁盘上的大量文件,可以将这些文件存储为KTX包装器格式。