c++ 在OpenGL中以特定索引加载BMP图像

7vhp5slm  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(123)

我必须从一个使用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的替代方法?我看过cimgdevil等,但是没有一个像iShowBMP函数那样工作。我正在用代码块做我的项目。
我必须加载每一帧以保持实现与程序其他部分的一致性。而且,名称作为参数传递给函数的bmp文件的宽度和高度都是2的幂。

6rqinv9w

6rqinv9w1#

最后两条free()语句由于一些未知原因没有执行,所以内存消耗增加,这就是为什么程序过了一会儿就崩溃了,后来我用stb_image. h解决了这个问题。

相关问题