我想从资源文件加载HBITMAP并将其用作OpenGL纹理。我使用的代码:

HBITMAP hBmp = (HBITMAP) LoadImage(hInstance,
            MAKEINTRESOURCE(id), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
BITMAP BM;
GetObject(hBmp, sizeof(BM), &BM);

glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
GLvoid* bits = BM.bmBits;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, BM.bmWidth,
        BM.bmHeight, 0, GL_BGRA_EXT,
        GL_UNSIGNED_BYTE,
        bits);


但是我总是从Visual Studio中收到一个错误,我无法访问指针bits。错误在代码的最后一行:

bits);


实际上,我可以使用NULL指针代替bits而不会出现错误。我可以将bits输出到使用消息框。有人知道我的代码有什么问题吗?

最佳答案

GetObject文档中:


  如果hgdiobj是通过任何其他方式创建的位图的句柄,则GetObject仅返回位图的宽度,高度和颜色格式信息。您可以通过调用GetDIBitsGetBitmapBits函数来获取位图的位值。


在上下文中,“其他方式”是除CreateDIBSection以外的任何东西。您不使用CreateDIBSection,而是使用LoadImageLR_CREATEDIBSECTION标志将您归入哪个类别尚不清楚,但解决方法很明确:使用GetDIBits

关于c++ - 加载并将HBITMAP转换为OpenGL纹理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23301171/

10-11 15:12