简体   繁体   English

加载 HBITMAP 并将其转换为 OpenGL 纹理

[英]Loading and Converting a HBITMAP to an OpenGL Texture

I want to load a HBITMAP from a resource file and use it as an OpenGL texture.我想从资源文件加载 HBITMAP 并将其用作 OpenGL 纹理。 The code I use:我使用的代码:

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

But I allways get an error from Visual Studio that I dont have access to the pointer bits .但是我总是从 Visual Studio 收到一个错误,我无权访问指针bits The error is at the last line of code:错误在最后一行代码:

bits);

I actually can use the NULL pointer instead of bits without getting an error.我实际上可以使用 NULL 指针而不是bits而不会出错。 I can output bits to using a messagebox.我可以使用消息框输出bits Does anybody have an idea what is wrong with my code?有人知道我的代码有什么问题吗?

From the GetObject documentation:GetObject文档:

If hgdiobj is a handle to a bitmap created by any other means, GetObject returns only the width, height, and color format information of the bitmap.如果hgdiobj是通过任何其他方式创建的位图的句柄,则GetObject仅返回位图的宽度、高度和颜色格式信息。 You can obtain the bitmap's bit values by calling the GetDIBits or GetBitmapBits function.您可以通过调用GetDIBitsGetBitmapBits函数来获取位图的位值。

In context, "other means" is anything other than CreateDIBSection .在上下文中,“其他方式”是除CreateDIBSection之外的任何内容。 You're not using CreateDIBSection , you're using LoadImage .您没有使用CreateDIBSection ,而是使用LoadImage Which category the LR_CREATEDIBSECTION flag puts you into is unclear, but the workaround is clear: Use GetDIBits . LR_CREATEDIBSECTION标志将您归入哪个类别尚不清楚,但解决方法很明确:使用GetDIBits

Working solution for GLUT on Windows XP (tcc or lcc compiler) Windows XP 上 GLUT 的工作解决方案(tcc 或 lcc 编译器)

GLuint LoadTexture(GLuint tex, const char * filename)
{
HBITMAP hBitmap;
BITMAP bm;
HINSTANCE hInstance = GetModuleHandle(NULL);

//standard bmp 24 bit
//supported resolutions 64x64, 128x128, 256x256, 512x512

//type "char" has a 1 byte size, other types take more byte and will not work
unsigned char * data;
unsigned char R, G, B;

//LoadImage() loads the bmp picture as an interlaced image
hBitmap = LoadImage(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    
GetObject(hBitmap, sizeof(BITMAP), &bm);

//get the address of the start of the image data in memory 
data =  bm.bmBits;

//swap R, G, B values for correct color display

int index, i;

for (i = 0; i < bm.bmWidth * bm.bmHeight ; i++)
    {
    index = i*3;
    B = data[index]; G = data[index+1]; R = data[index+2];
    data[index] = R; data[index+1] = G; data[index+2] = B;
    }

//print image parameters
printf ("bmType %u\n",bm.bmType); 
printf ("bmWidth %u\n",bm.bmWidth); 
printf ("bmHeight %u\n",bm.bmHeight); 
printf ("bmWidthBytes %u\n",bm.bmWidthBytes); 
printf ("bmPlanes %u\n",bm.bmPlanes); 
printf ("bmBitsPixel %u\n",bm.bmBitsPixel); 
printf ("bmBits %p\n",bm.bmBits);
printf ("hInstance %p\n",hInstance);

//create texture from loaded bmp image 
glGenTextures( 1, &tex);
glBindTexture( GL_TEXTURE_2D, tex);

glTexImage2D(GL_TEXTURE_2D, 0, 4, bm.bmWidth, bm.bmHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bm.bmBits);

printf ("--- texture %u created ---\n", tex);

//texture filtering
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}

void init(void)
{
//enable texturing
glEnable(GL_TEXTURE_2D);
//load texture from bmp 24 bit image file
//bmp exported from mspaint for windows xp
LoadTexture(1, "image1.bmp");
LoadTexture(2, "image2.bmp");
LoadTexture(3, "image3.bmp");
LoadTexture(4, "image4.bmp");
LoadTexture(5, "image5.bmp");
LoadTexture(6, "image6.bmp");
. . . . . . . . . . . . . . . . . . . .

Compiling.编译。

no cyrilic names, "" for names with spases没有西里尔字母,"" 表示带有空格的名称

tcc C:\\tcc\\src\\box\\box.c -o C:\\tcc\\src\\box\\box.exe -LC:\\tcc\\lib -luser32 -lgdi32 -lopengl32 -lglu32 -lglut32 -Wl,-subsystem=console tcc C:\\tcc\\src\\box\\box.c -o C:\\tcc\\src\\box\\box.exe -LC:\\tcc\\lib -luser32 -lgdi32 -lopengl32 -lglu32 -lglut32 -Wl,-subsystem=安慰

(without console -Wl,-subsystem=windows) (没有控制台 -Wl,-subsystem=windows)

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM