的第 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
要求每条扫描线都是字对齐的。
操作的 alignmnetglReadPixels
可以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];