我想从资源文件加载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
。有没有人知道我的代码有什么问题?
答案 0 :(得分:3)
来自GetObject
文档:
如果
hgdiobj
是通过任何其他方式创建的位图的句柄,GetObject
仅返回位图的宽度,高度和颜色格式信息。您可以通过调用GetDIBits
或GetBitmapBits
函数来获取位图的位值。
在上下文中,“其他方式”不是CreateDIBSection
。您没有使用CreateDIBSection
,而是使用LoadImage
。 LR_CREATEDIBSECTION
标记所针对的类别尚不清楚,但解决方法很明确:使用GetDIBits
。
答案 1 :(得分:0)
适用于 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");
. . . . . . . . . . . . . . . . . . . .
编译。
没有西里尔字母的名字,"" 表示有空格的名字
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
(没有控制台 -Wl,-subsystem=windows)