Не удалось создать HBITMAP из glReadpixels

Итак, вот часть моего кода, я пытаюсь сделать 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

Решение

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

Поскольку формат данных пикселей GL_RGB3-й параметр 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];
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]