Как получить 6 граней из куба - PullRequest
0 голосов
/ 07 июля 2019

Я анализирую файл текстуры TGA, который должен быть GL_TEXTURE_CUBE_MAP

char* pixelsArray = LoadTGA(getPath(), &width, &height, &bpp);

и я не могу понять, как вернуть 6 граней куба.

Я попытался получить некоторые относительные индексы для пикселя, массива и граней. Что-то вроде:

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 голосов
/ 08 июля 2019

Чтобы ответить на ваш вопрос, вашему загрузчику нужно будет скопировать 6 суб-граней в отдельный массив и загрузить каждое извлеченное суб-изображение в glTexImage2D().

Лучший ответ - "почему ты так делаешь"? Ваш TGA содержит огромное количество потерянного пространства, а TGA - несжатый формат. Это означает, что у вас большой размер установки и высокая пропускная способность памяти. Выделите 6 граней в автономном режиме, сожмите их и отразите их, например, на ASTC или ETC формат. Вы можете хранить их в формате оболочки KTX, если хотите избежать обработки большого количества файлов на диске.

...