【问题标题】:Loading PNG textures to OpenGL将 PNG 纹理加载到 OpenGL
【发布时间】:2025-12-02 10:35:01
【问题描述】:

我正在开发一款游戏,我的所有图形都使用洋红色作为透明/魔法颜色。 它们都是 32 位的,洋红色只是为了方便。 无论如何,如果有人能建议我应该使用什么库来加载我的图像,我将不胜感激(我需要以 GL_RGBA 格式加载它们,包括内部和纹理特定的)。

【问题讨论】:

    标签: opengl png 32-bit textures


    【解决方案1】:

    如果只需要 PNG 支持,请使用 libpng。 DevIL 应该很简单,但它有点臃肿(不仅仅是加载图像),并且在内部实际上调用了 OpenGL 函数,这可能会弄乱你自己的 OpenGL 逻辑。

    我个人更喜欢 SDL_image,因为无论如何我都在我的项目中使用 SDL。虽然不是很明显,但 SDL_BlitSurface() 函数可以将 IMG_Load() 返回的任何内容转换为必要的像素格式。

    【讨论】:

    • DevIL 可用于仅加载图像(此时没有 OpenGL 调用)或将图像直接加载到 OpenGL 纹理中(必须调用 OpenGL 函数)。
    【解决方案2】:

    DevIL 可以加载几乎所有文件格式,并且可以直接创建 OpenGL 纹理。这是最简单的方法。

    您还应该使用支持 Alpha 通道的文件格式(PNG、TGA、...)。在 32 位图像中使用“魔法颜色”确实过时了!

    【讨论】:

    【解决方案3】:

    除了提到 SDL 和 DevIL 的其他答案外,还有两个选项需要考虑:

    • 直接使用 libpng。如果重要的话,这可能对代码大小的影响最小,因为你不会因为其他不使用的格式而膨胀,没有 DLL,等等。
    • 使用操作系统纹理加载。如果您更喜欢使用操作系统功能而不是外部库,这可能是减少依赖关系的好方法。 Windows XP 及更高版本中的 GDI+ 内置了针对 PNG 和 JPEG 等几种格式的纹理加载,我不确定,但其他操作系统可能具有类似的功能。将 GDI+ 连接到 OpenGL 非常简单,然后操作系统会处理您的纹理加载!

    【讨论】:

    • 请参见此处第 510 行的 GLTexture::LoadFromFile():construct2.svn.sourceforge.net/viewvc/construct2/source/common/… 虽然它可能比您需要的要复杂一些 - 它使用预乘纹理并具有将纹理复制到电源的代码 -具有透明排水沟的两个表面。
    • 为什么要为如何加载图像而烦恼,当周围有图书馆可以为你做这件事时。
    【解决方案4】:

    这里有一个非常简单的将 png 加载到 openGL 的文件示例:

    http://tfc.duke.free.fr/coding/src/png.c

    【讨论】:

      【解决方案5】:

      另一个选项是 OpenCV。

      它不仅可以加载纹理,而且还可以使用它的其他功能。

      【讨论】:

      • OpenCV 是否提供函数以准备好输入 OpenGL 纹理的格式提供图像数据?