Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хук glTexImage2D. 
V
    Опции темы
CynicRus
Дата 13.9.2012, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Доброго времени суток господа, возникла проблемка. Задача - записать OpenGL текстуру при хуке функции glTexImage2D.
Код

GL_EXTERN void __stdcall GLHook_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLint format, GLenum type, const GLvoid *pixels)
{
    (*optr_glTexImage2D) (target, level, internalformat, width, height, border, format, type, pixels);
    SaveBMP(format,width,height,pixels);
}

Для этого пишу функцию SaveBMP(bitmap необходимо сформировать руками, потому как требуется платформонезависимое решение).
Код

void SaveBMP(GLuint Format, GLuint Width, GLuint Height, const GLvoid *Pixels)
{
    unsigned char* data;
    data = (unsigned char *)Pixels;
    time_t seconds = time(NULL);
    tm* timeinfo = localtime(&seconds);
    std::fstream bmp("C:/TestBMP/Bitmap"+(std::string)asctime(timeinfo)+".bmp", std::fstream::out | std::fstream::binary);
    unsigned char signature[2] = { 'B', 'M' };
    unsigned int fileSize = 14 + 40 + Width*Height*4;
    unsigned int reserved = 0;
    unsigned int offset = 14 + 40;
    unsigned int headerSize = 40;
    unsigned int dimensions[2] = { Width, Height };
    unsigned short colorPlanes = 1;
    unsigned short bpp = 32;
    unsigned int compression = 0;
    unsigned int imgSize = Width*Height*4;
    bmp.write(reinterpret_cast<char*>(signature), sizeof(signature));
    bmp.write(reinterpret_cast<char*>(&fileSize), sizeof(fileSize));
    bmp.write(reinterpret_cast<char*>(&reserved), sizeof(reserved));
    bmp.write(reinterpret_cast<char*>(&offset),   sizeof(offset));
    bmp.write(reinterpret_cast<char*>(&headerSize),  sizeof(headerSize));
    bmp.write(reinterpret_cast<char*>(dimensions),   sizeof(dimensions));
    bmp.write(reinterpret_cast<char*>(&colorPlanes), sizeof(colorPlanes));
    bmp.write(reinterpret_cast<char*>(&bpp),         sizeof(bpp));
    bmp.write(reinterpret_cast<char*>(&compression), sizeof(compression));
    bmp.write(reinterpret_cast<char*>(&imgSize),     sizeof(imgSize));
     for (int I = 0; I < Height; I++)
         {
                 for (int J = 0; J < Width; J++)
                 {
                     bmp.write((char *)&data[I,J],sizeof(data[I,J]));
                 }
        }
   bmp.close();
}
 ну и при включении этой функции в библиотеку хука, всё благополучно падает. С ошибкой 939 в недрах vector. Почему - понять не могу, файл соответственно не генерится, подозреваю - чего-то я с Pixels натупил. Собственно вопрос - каким образом GLVoid *pixels записать в битмап?

Это сообщение отредактировал(а) CynicRus - 13.9.2012, 23:11
PM MAIL   Вверх
Amp
Дата 13.9.2012, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 2
Всего: 17



Про сам хук ничего сказать не могу, может быть дело и в нем. Но из того, что бросается в глаза - ты же начисто игнорируешь формат и тип данных, загружаемых в текстуру, делая предположение, что там всегда "unsigned char" и rgba.
PM MAIL   Вверх
CynicRus
Дата 13.9.2012, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Так...А как мне сие не игнорировать? Я знаю что формат всегда GL_RGB.

Добавлено через 12 секунд
PS: сам хук работает
PM MAIL   Вверх
CynicRus
Дата 14.9.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Код

void Bitmap::SaveBMP(GLuint Format, GLuint Width, GLuint Height, const GLvoid *Pointer)
{
     Pixels.clear();
     int BitsPerPixel = 32;
     memset(&Info, 0, sizeof(BITMAPINFO));
     width = Width; height = Height;
     size = ((width * BitsPerPixel + 31) / 32) * 4 * height;
     Info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
     Info.bmiHeader.biWidth = width;
     Info.bmiHeader.biHeight = height;
     Info.bmiHeader.biPlanes = 1;
     Info.bmiHeader.biBitCount = BitsPerPixel;
     Info.bmiHeader.biCompression = BI_RGB;
     Info.bmiHeader.biSizeImage = size;
     bFileHeader.bfType = 0x4D42;
     bFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(Info.bmiHeader);
     bFileHeader.bfSize = bFileHeader.bfOffBits + size;
     const unsigned char* BuffPos = static_cast<const unsigned char*>(Pointer);
     height = (height < 0 ? -height : height);
     Pixels.resize(width * height);
     time_t seconds = time(NULL);
     tm* timeinfo = localtime(&seconds);
     CreateDirectory("Images/", NULL);
     std::fstream bmp("Images/"+(std::string)asctime(timeinfo)+".bmp", std::fstream::out | std::fstream::binary);
     bmp.write(reinterpret_cast<char*>(bFileHeader.bfType), sizeof(bFileHeader.bfType));
     bmp.write(reinterpret_cast<char*>(bFileHeader.bfSize), sizeof(bFileHeader.bfSize));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biSize), sizeof(Info.bmiHeader.biSize));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biSize), sizeof(Info.bmiHeader.biSize));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biWidth), sizeof(Info.bmiHeader.biWidth));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biHeight), sizeof(Info.bmiHeader.biHeight));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biPlanes), sizeof(Info.bmiHeader.biPlanes));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biBitCount), sizeof(Info.bmiHeader.biBitCount));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biCompression), sizeof(Info.bmiHeader.biCompression));
     bmp.write(reinterpret_cast<char*>(Info.bmiHeader.biSizeImage), sizeof(Info.bmiHeader.biSizeImage));
     for (int I = 0; I < height; I++)
    {
        for (int J = 0; J < width; J++)
        {
            Pixels[(height - 1 - I) * width + J].RGBA.B = *(BuffPos++);
            Pixels[(height - 1 - I) * width + J].RGBA.G = *(BuffPos++);
            Pixels[(height - 1 - I) * width + J].RGBA.R = *(BuffPos++);
            Pixels[(height - 1 - I) * width + J].RGBA.A = (Info.bmiHeader.biBitCount > 24 ? *(BuffPos++) : 0);
        }
        if(Info.bmiHeader.biBitCount == 24)
            BuffPos += width % 4;
    }
    int len = Pixels.size();
    for (int b = 0; b < len; b++)
    {
        bmp.write(reinterpret_cast<char*>(&Pixels[b]),sizeof(Pixels[b]));
    }
    bmp.close();
}
 собственно - разобрался. Всем спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.