Не удалось создать HBITMAP из glReadpixels - PullRequest
0 голосов
/ 18 мая 2018

Итак, вот часть моего кода, что я пытаюсь сделать, это сделать HBITMAP из захвата фрейма OpenGl.

unsigned char *output = 0;
output = new unsigned char[WINDOW_WIDTH * WINDOW_HEIGHT * 3];

glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE,
    output);

HBITMAP hdm = CreateBitmap(800, 800, 1, 32, output);

Но мой (HBITMAP) hdm всегда равен NULL.Может есть другой способ сделать это или что не так?Я предполагаю, что CreateBitmap выделит саму память, поэтому здесь не должно быть ошибки.Массив вывода, кажется, все в порядке.

Я также попробовал код отсюда: Создание HBITMAP из glReadPixels , но он также не работал, все еще получая NULL.

Буду признателен за любую помощь в этом!

1 Ответ

0 голосов
/ 18 мая 2018

4-й параметр CreateBitmap - это количество битов, необходимых для идентификации цвета одного пикселя.

Поскольку формат данных пикселя равен GL_RGB,3-й параметр CreateBitmap имеет значение 24 вместо 32. Примечание GL_RGB / GL_UNSIGNED_BYTE означает 3 компонента цвета с каждым байтом, что приводит к 24 битам:

HBITMAP hdm = CreateBitmap(WINDOW_WIDTH, WINDOW_HEIGHT, 1, 24, output);

Или вы должны использоватьформат GL_RGBA:

unsigned char *output = new unsigned char[WINDOW_WIDTH * WINDOW_HEIGHT * 4];
glReadPixels(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, output);

HBITMAP hdm = CreateBitmap(WINDOW_WIDTH, WINDOW_HEIGHT, 1, 32, output);

Примечание. Если вы используете формат GL_RGB, вы должны учитывать, что CreateBitmap требует, чтобы каждая строка сканирования была выровнена по словам.Параметр alignmnet для операции glReadPixels можно установить с помощью glPixelStorei, установив параметр GL_PACK_ALIGNMENT, который по умолчанию равен 4, поэтому это не должно вызывать проблем.Но вы должны убедиться, что динамически распределенный буфер достаточно велик:

size_t bpl = WINDOW_WIDTH * 3; // bytes per line
size_t r   = bpl % 4;          // rest of division by 4
bpl       += r ? (4-r) : 0;    // bytes per line aligned to 4
unsigned char *output = new unsigned char[bpl * WINDOW_HEIGHT];

или

size_t bpl = (WINDOW_WIDTH * 3 + 3) & ~3;
unsigned char *output = new unsigned char[bpl * WINDOW_HEIGHT];
...