好的,所以我将C ++与OpenGL一起使用,并且我将创建一个加载器以为3D游戏加载纹理。(但是纹理是2D的)。我决定选择透明度,即使我决定不使用它。我需要像样的质量,尽管不一定要一流。你们对格式有什么建议(PNG,TGA等)。另外,也许可以使其易于创建装载程序(我将不使用已经创建的装载程序)。而且,如果您有任何链接/提示来帮助加载程序,那将不胜感激。
好的,所以我将C ++与OpenGL一起使用,并且我将创建一个加载器以为3D游戏加载纹理。(但是纹理是2D的)。我决定选择透明度,即使我决定不使用它。我需要像样的质量,尽管不一定要一流。你们对格式有什么建议(PNG,TGA等)。另外,也许可以使其易于创建装载程序(我将不使用已经创建的装载程序)。而且,如果您有任何链接/提示来帮助加载程序,那将不胜感激。
Answers:
我不明白为什么您不希望使用现成的加载器。例如,PNG是一种格式的不错选择,但编写通用的装载程序很复杂(也许不值得编写只装载您关注的PNG格式的特定子集的工作)。
鉴于有些不寻常的要求,TGA可能是您最好的选择。TGA 2.0具有Alpha通道,并且与PNG相比相对简单。
图像纹理格式也是一种性能选择。我建议您尽可能使用压缩纹理。在移动平台上,它可以极大地提高性能(40%甚至更多),内存使用和时间加载。
考虑一个1024 * 1024的纹理:
在我们的游戏中,我们拥有多种格式的资产(纹理):
最后,我们使用原始格式来实现兼容性,但这是为了兼容性或GUI元素
ETC1纹理没有alpha通道,因此我们使用具有两个纹理(rgb纹理和alpha纹理)的特殊着色器。压缩格式非常易于加载(100或200 loc)。
在台式机上,许多卡上都有DXTC(S3TC)。因此,您应该使用它。
压缩纹理
专业版
骗子
纹理是一个或多个图像的集合。这意味着纹理可以用TGA或PNG表示,但是两种格式都不能表示纹理的所有可能特征。为什么?
因为每一个只能容纳一个单一的形象。没有mipmap。没有3D纹理可能。没有数组纹理。没有立方体贴图。这些文件中的每一个都只是一个2D图像。它们可以是纹理的一部分,但是除非您没有使用mipmapping(除非您有特殊需要,否则我强烈建议您不要使用mipmaps),否则这些格式的单个图像文件就不能成为纹理。
它们是良好的图像格式,但它们的纹理格式不佳。
DDS是纹理格式的领先者,因为它实际上支持纹理需求。它支持mipmaps和cubemaps。它支持3D纹理。DDSv10支持数组纹理。您可以用DNG内无法打包的单个纹理打包PNG或TGA。
DDS支持未压缩和压缩的纹理数据。只要压缩纹理格式是DXT / BC纹理格式之一即可。
PKM对于包装ETC1压缩的图像很有用,但与PNG一样,它不支持实际的纹理特征。
PVR文件似乎与DDS在移动设备上等效(尽管我不知道为什么它们不能只使用DDS)。它们支持各种压缩技术,但是缺少高级DDSv10功能,例如阵列纹理以及3D纹理支持。
因此DDS在全面的纹理支持方面胜出。
似乎DDS(DirectDraw曲面)是当前最受欢迎的纹理选择。具有不同的像素格式,透明度和压缩率。OpenGL通过GL_ARB_texture_compression扩展支持该功能。
例如,有一个OpenGL装载机这里。
这里有许多注意事项:
TGA是一个不错的选择,因为在24位和32位未压缩的情况下,您可以一次读取/读取任何数据,然后直接通过glTexImage2D发送结果,而无需进行进一步处理。这是一个不好的选择,因为它可能具有最大的文件大小,并且如果磁盘I / O成为瓶颈,则读取速度会很慢。
PNG是一个不错的选择,因为它可以以较小的文件大小保留图像的质量。这是一个不好的选择,因为PNG的解压缩速度可能很慢-如果那是您的瓶颈,那么-知道了。
JPG是一个不错的选择,因为它通常具有最小的文件大小,并且会非常快地从磁盘上删除(如果需要通过网络发送文件,则效果很好)。由于中间的软件解压缩步骤和质量损失,这是一个不好的选择(尽管您可以调整质量设置来减轻这种情况)。也没有Alpha通道。
DDS(或其他压缩格式)是个不错的选择,因为文件较小,并且可以包含预构建的mipmap链。如果这种格式是硬件本身支持的格式(并且大多数消费PC硬件本身也支持DDS-已有很长的历史了),那么您将获得与TGA相同的好处-一个缺点,在标题中加一点戳以找出一些图像属性,然后直接发送数据而无需中间步骤。压缩的纹理还将使您的程序运行更快,并使用更少的视频RAM。它们是错误的选择,因为它们使用有损压缩(有时可能确实很明显),并且可能并非所有硬件都支持。
如果是我,我将为所有这四种格式提供支持(使用JPG和PNG,我会使用图像库来为TGA和DDS编写加载程序非常简单),以便内容创建者可以选择最合适的格式基于每个纹理。