Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2015, 06:16   #1
Nonexistent
Новичок
Джуниор
 
Регистрация: 11.05.2015
Сообщений: 2
По умолчанию Прошу помочь с OpenGL (требуется сохранить текстуру)

Приветствую всех, кто заглянул в мою тему. В C++ я не профи, пишу в основном на других языках. Не могу разобраться, как сохранить текстуру из OpenGL, зная ее texture id. Гугл не помог с этой проблемой. Имеется исходный код, который разбирает некий архив с текстурами. Формат текстур следующий - jpg картинка + alpha канал прозрачности, который применяется в этом же коде, и функция возвращает id уже готовой текстуры с прозрачностью. Моя задача в следующем - получить исходные текстуры из архива желательно в формате png (но сойдет и любой другой, главное вытащить картинку с прозрачностью, т.к. это и есть основная задача).
Функция загрузки текстуры:
Код:
GLuint Paq::loadJaz(const char *filePath) {
    paqFile *fPtr;
    SDL_Surface *jpg;
    SDL_RWops *fPtrRw;
    Uint32 compSize, origSize, jpgSize, compAlphaSize, origAlphaSize, currSize, *mixedImageData;
    Uint8 *compData, *origData, *jpgData, *compAlphaData, *origAlphaData, prevChar, currChar;
    GLenum textureFormat;
    GLuint texture;
 
    /* Get file data */
    fPtr = getFile(filePath);
 
    /* Get compressed data */
    memcpy(&compSize, fPtr->fileData + 1, 4);
    compData = new Uint8[compSize];
    memcpy(compData, fPtr->fileData + 9, compSize);
 
    /* Get extracted data */
    memcpy(&origSize, fPtr->fileData + 5, 4);
    origData = new Uint8[origSize];
    uncompress(origData, (uLongf *)&origSize, compData, compSize);
 
    /* Get jpg data */
    memcpy(&jpgSize, origData, 4);
    jpgData = new Uint8[jpgSize];
    memcpy(jpgData, origData + 4, jpgSize);
 
    /* Create jpg surface */
    fPtrRw = SDL_RWFromMem(jpgData, jpgSize);
    jpg = IMG_LoadJPG_RW(fPtrRw);
 
    /* Get sizes for alpha */
    origAlphaSize = jpg->w * jpg->h;
    compAlphaSize = origSize - 4 - jpgSize;
 
    /* Get alpha data */
    compAlphaData = new Uint8[compAlphaSize];
    memcpy(compAlphaData, origData + 4 + jpgSize, compAlphaSize);
 
    /* Decode RLE */
    currSize = 0;
    origAlphaData = new Uint8[origAlphaSize];
    for (int i = 0; i < compAlphaSize; i++) {
        prevChar = compAlphaData[i];
        currChar = compAlphaData[++i];
 
        for (int j = 0; j < prevChar; j++, currSize++)
            origAlphaData[currSize] = currChar;
    }
 
    /* Create mixed data array 
     * NOTE: mixedImageSize = origAlphaSize */
    mixedImageData = new Uint32[origAlphaSize];
    for (int i = 0; i < origAlphaSize; i++) {
        /* pixels + y * pitch - x * bytesPerPixel => points the pixel (x,y) */
        Uint8 *p = (Uint8 *)jpg->pixels + (i / jpg->w) * jpg->pitch + (i % jpg->w) * jpg->format->BytesPerPixel;
 
        /* Rearrange bytes according to byte order */
        if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
            mixedImageData[i] = origAlphaData[i] << 24 | p[0] << 16 | p[1] << 8 | p[2];
        else
            mixedImageData[i] = p[0] | p[1] << 8 | p[2] << 16 | origAlphaData[i] << 24;
    }
 
    /* Get byte order */
    if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
        textureFormat = GL_BGRA;
    else
        textureFormat = GL_RGBA;
 
    /* Create GL texture */
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 4, jpg->w, jpg->h, 0, textureFormat, GL_UNSIGNED_BYTE, mixedImageData);
 
    /* Cleaning */
    delete compData;
    delete origData;
    delete jpgData;
    delete compAlphaData;
    delete origAlphaData;
    delete mixedImageData;
 
    SDL_RWclose(fPtrRw);
    SDL_FreeSurface(jpg);
 
    return texture;
}
P.S. код не мой, взял его с SVN разработчиков, и подключил у себя.

Последний раз редактировалось Stilet; 11.05.2015 в 06:24.
Nonexistent вне форума Ответить с цитированием
Старый 11.05.2015, 09:46   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Насколько я понимаю, перед вот этой строчкой надо вставить запись в файл:
fPtrRw = SDL_RWFromMem(jpgData, jpgSize);

Как записывать в файл знаете?
waleri вне форума Ответить с цитированием
Старый 11.05.2015, 10:45   #3
Nonexistent
Новичок
Джуниор
 
Регистрация: 11.05.2015
Сообщений: 2
По умолчанию

В jpgData вроде же без прозрачности. А в mixedImageData картинка с прозрачностью. Насколько понял, там из функции возвращается что-то вроде id текстуры в памяти. Но это только то, что сказал мне гугл, дальнейшие поиски ни к чему не привели. Если правильно думаю, можно по результату функции получить текстуру, зная ее id, и сохранить в файл. В теории немного знаю, как сохранять, но чувствую, что здесь стандартными функциями не обойтись, поэтому не отказался бы от кода) Уверен, что решение кроется за несколькими строками, но я не спец в C++, и тем более в api OpenGL.
Nonexistent вне форума Ответить с цитированием
Старый 11.05.2015, 10:56   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Вот здесь в памяти есть RGBA битмап, осталось только его сохранить.
Ищите код сохранения BMP файла - так проще всего, потом сконвертируете в нужный формат.

glTexImage2D(GL_TEXTURE_2D, 0, 4, jpg->w, jpg->h, 0, textureFormat, GL_UNSIGNED_BYTE, mixedImageData);
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL C++ наложить текстуру на все фигуры Shade2015 Помощь студентам 3 26.04.2015 18:14
Прошу помочь,требуется решение и объяснение. Михаил_ Помощь студентам 0 25.10.2011 22:24
Нужен исходник загрузки текстуру в OpenGL pufystyj Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 19.07.2011 03:07
OpenGL рендеринг в текстуру или ... SalasAndriy Мультимедиа в Delphi 14 22.11.2010 08:27
OpenGl+Delphi,при загрузке текстуру сильно корежит Skif Помощь студентам 1 27.11.2007 08:40