因此,这是我的代码的一部分,我想做的是从OpenGl帧捕获中制作HBITMAP。

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会自己分配内存,因此错误一定不在这里。输出数组似乎很好。

我也从这里尝试过代码:Creating a HBITMAP from glReadPixels,但它也无法正常工作,仍然为NULL。

希望对此有所帮助!

最佳答案

CreateBitmap 的第四个参数是识别单个像素颜色所需的位数。

由于像素数据的格式为GL_RGB,因此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 要求每条扫描线均按单词对齐。
glReadPixels 操作的alignmnet可以由 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];

10-08 08:34