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];