[英]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 theGetDIBits
orGetBitmapBits
function.您可以通过调用GetDIBits
或GetBitmapBits
函数来获取位图的位值。
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.