最佳(最流行?)纹理化图像格式[关闭]


13

好的,所以我将C ++与OpenGL一起使用,并且我将创建一个加载器以为3D游戏加载纹理。(但是纹理是2D的)。我决定选择透明度,即使我决定不使用它。我需要像样的质量,尽管不一定要一流。你们对格式有什么建议(PNG,TGA等)。另外,也许可以使其易于创建装载程序(我将不使用已经创建的装载程序)。而且,如果您有任何链接/提示来帮助加载程序,那将不胜感激。

Answers:


15

我不明白为什么您不希望使用现成的加载器。例如,PNG是一种格式的不错选择,但编写通用的装载程序很复杂(也许不值得编写只装载您关注的PNG格式的特定子集的工作)。

鉴于有些不寻常的要求,TGA可能是您最好的选择。TGA 2.0具有Alpha通道,并且与PNG相比相对简单。


3
如果OP希望自己编写,则TGA +1。我曾经写过我自己的TGA加载器。如此快捷,轻松。
共产党鸭子

4
@Duck:只要您正在执行简单的无压缩或没有任何精美功能的TGA,就不会感到痛苦。如果您想要一个完全兼容的TGA装载机,我发现这有点麻烦。这有点奇怪。
ZorbaTHut 2011年

1
@Zorba,压缩很容易。无论您是否关心扩展,它都是如此。
deceleratedcaviar

10

图像纹理格式也是一种性能选择。我建议您尽可能使用压缩纹理。在移动平台上,它可以极大地提高性能(40%甚至更多),内存使用和时间加载。

考虑一个1024 * 1024的纹理:

  • RGB或RGBA(16位元):2Mo(在SGS上载入0.5秒)
  • RGBA(32bits):4Mo(1s在SGS上加载)
  • PVRT(4bpp):512ko(.125s,在SGS上加载)
  • ETC1 + Alpha:1.5Mo(在SGS上加载0.4s)

在我们的游戏中,我们拥有多种格式的资产(纹理):

  • DXTC纹理的DDS格式(桌面平台:OS X,Linux,Windows和Tegra)
  • 适用于ATC纹理的DDS格式(Andreno GPU)
  • PVRT格式的PVR格式(PowerVR GPU)
  • ETC1纹理的PKM格式(与所有OGLES 2.0设备兼容)

最后,我们使用原始格式来实现兼容性,但这是为了兼容性或GUI元素

  • 原始纹理的PNG格式。它适用于RGBA 16、24或32位纹理(我们使用MIT许可的加载器)。它是未压缩的纹理。

ETC1纹理没有alpha通道,因此我们使用具有两个纹理(rgb纹理和alpha纹理)的特殊着色器。压缩格式非常易于加载(100或200 loc)。

在台式机上,许多卡上都有DXTC(S3TC)。因此,您应该使用它。

压缩纹理

专业版

  • 纹理填充率提高
  • 纹理加载(4倍或更多)
  • 易于装载

骗子

  • 并非在所有平台上都受支持
  • 人工制品

6
在视频卡上压缩的纹理(例如DXTC)与仅在存储时压缩并且必须在加载期间解压缩的纹理(例如PNG)之间存在很大差异。PNG的加载比未压缩的纹理要,因为必须先对其进行解压缩。它们是较小的文件大小,是的,但是消耗的图形内存量是相同的。
2011年

8

纹理是一个或多个图像的集合。这意味着纹理可以用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在全面的纹理支持方面胜出。


2
纯粹是出于功能方面的考虑,TIFF支持DDS所做的所有工作以及更多功能。是否需要除Alpha外还具有远红外,近红外,R,G,B和UV通道的纹理?每通道64位IEEE浮点数?是否已通过适合该通道的多种算法(包括JPEG和JPEG2000)中的任何一种进行了压缩?每个文件有多个图像,并且每个图像都有丰富的元数据?它可以完成所有这一切,甚至更多。一段时间以来,它也是Photoshop的“本机”格式。现在,为为其编写装载程序 ...
Martin Sojka

请允许我添加更多有关在DDS容器下仅使用DXT / BC纹理格式的要求的信息;似乎并非如此。我见过Compressonator使用各种压缩格式并将其全部输出为.dds(执行cli时可以从帮助输出中看到此提示),SO的[this](answer)表示可以使用任何压缩格式(设置不同的FourCC然后处理自己)。
haxpor

1
@haxpor:您可以将文件中所需的内容转换为DDS。问题是,可以读取常规DDS文件的应用程序将能够读取您的文件,还是必须对其进行特殊编码才能读取?DDS格式仅指定 DXT / BC压缩格式(我现在认为是ASTC)。如果您使用其他格式,则会在编写该程序和读取该程序之间发生变化。但这几乎适用于任何图像格式。
Nicol Bolas

@NicolBolas感谢您总结。我觉得这就是。
haxpor

5

Khronos Group建议使用KTX文件格式来存储OpenGL和OpenGL ES应用程序的纹理。您可以使用libktx处理这种格式。

特征:

  • 从KTX文件实例化OpenGL纹理
  • 当硬件不支持ETC1时,解压缩ETC1压缩的纹理图像。
  • 加载纹理时,从KTX文件构造键-值对的哈希表
  • 根据源图像数组和可选的键/值对哈希表编写一个KTX文件。
  • 构造并填充键值对的哈希表。

3

似乎DDS(DirectDraw曲面)是当前最受欢迎的纹理选择。具有不同的像素格式,透明度和压缩率。OpenGL通过GL_ARB_texture_compression扩展支持该功能。

例如,有一个OpenGL装载机这里


您的回答措词有些混乱。说OpenGL支持DDS是没有道理的。OpenGL不处理图像格式。
rdb

3

这里有许多注意事项:

  1. 您可以多快的速度将纹理从磁盘移入系统内存。
  2. 从系统内存到GPU的纹理获取速度有多快(在您的情况下,通过glTexImage2D)。
  3. 您的预算中有多少磁盘空间和视频RAM存储空间。
  4. 性能和质量。

TGA是一个不错的选择,因为在24位和32位未压缩的情况下,您可以一次读取/读取任何数据,然后直接通过glTexImage2D发送结果,而无需进行进一步处理。这是一个不好的选择,因为它可能具有最大的文件大小,并且如果磁盘I / O成为瓶颈,则读取速度会很慢。

PNG是一个不错的选择,因为它可以以较小的文件大小保留图像的质量。这是一个不好的选择,因为PNG的解压缩速度可能很慢-如果那是您的瓶颈,那么-知道了。

JPG是一个不错的选择,因为它通常具有最小的文件大小,并且会非常快地从磁盘上删除(如果需要通过网络发送文件,则效果很好)。由于中间的软件解压缩步骤和质量损失,这是一个不好的选择(尽管您可以调整质量设置来减轻这种情况)。也没有Alpha通道。

DDS(或其他压缩格式)是个不错的选择,因为文件较小,并且可以包含预构建的mipmap链。如果这种格式是硬件本身支持的格式(并且大多数消费PC硬件本身也支持DDS-已有很长的历史了),那么您将获得与TGA相同的好处-一个缺点,在标题中加一点戳以找出一些图像属性,然后直接发送数据而无需中间步骤。压缩的纹理还将使您的程序运行更快,并使用更少的视频RAM。它们是错误的选择,因为它们使用有损压缩(有时可能确实很明显),并且可能并非所有硬件都支持。

如果是我,我将为所有这四种格式提供支持(使用JPG和PNG,我会使用图像库来为TGA和DDS编写加载程序非常简单),以便内容创建者可以选择最合适的格式基于每个纹理。


1
“大多数消费类PC硬件本身都支持DDS” DDS是用于不同格式的容器。您无需将DDS文件传递给GPU,而是将其内容传递给GPU!
塔拉

0

当然,您总是可以使用确实很容易加载的旧的32位BMP(特别是如果大小为2的幂(实际上是8字节IIRC的倍数))。

否则,似乎只需要一种格式就很奇怪了,jpg对于不错的现实世界高分辨率纹理(jpeg确实使磁盘空间和(下载)加载时间赞叹不已)真是太酷了,为透明性提供了png,为控制纹理提供了偶尔的32位BMP (易于从脚本或“快速而肮脏的”工具创建)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.