我必须从一个使用OpenGL的文件中加载一个24位BMP文件,该文件位于glut窗口的某个(x,y)索引处。我发现了一个使用glaux库的函数。这里ignoreColor
中提到的颜色在渲染过程中被忽略。
void iShowBMP(int x, int y, char filename[], int ignoreColor)
{
AUX_RGBImageRec *TextureImage;
TextureImage = auxDIBImageLoad(filename);
int i,j,k;
int width = TextureImage->sizeX;
int height = TextureImage->sizeY;
int nPixels = width * height;
int *rgPixels = new int[nPixels];
for (i = 0, j=0; i < nPixels; i++, j += 3)
{
int rgb = 0;
for(int k = 2; k >= 0; k--)
{
rgb = ((rgb << 8) | TextureImage->data[j+k]);
}
rgPixels[i] = (rgb == ignoreColor) ? 0 : 255;
rgPixels[i] = ((rgPixels[i] << 24) | rgb);
}
glRasterPos2f(x, y);
glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, rgPixels);
delete []rgPixels;
free(TextureImage->data);
free(TextureImage);
}
但问题是glaux现在已经过时了,如果我调用这个函数,图像被渲染并显示了一分钟,然后弹出一个错误(没有任何错误信息),glut窗口消失了,从控制台显示的返回值来看,这似乎是一个运行时错误。
这个函数有没有不使用glaux的替代方法?我看过cimg,devil等,但是没有一个像iShowBMP
函数那样工作。我正在用代码块做我的项目。
我必须加载每一帧以保持实现与程序其他部分的一致性。而且,名称作为参数传递给函数的bmp文件的宽度和高度都是2的幂。
1条答案
按热度按时间6rqinv9w1#
最后两条free()语句由于一些未知原因没有执行,所以内存消耗增加,这就是为什么程序过了一会儿就崩溃了,后来我用stb_image. h解决了这个问题。