Celestia/纹理
我们看到的任何物体的外观在很大程度上取决于从物体表面每个点到达你眼睛的光线。它受到从表面反射的光线的特性、表面的颜色以及任何介于两者之间的半透明介质(如大气)的影响。Celestia 使用数学模型来计算这些效果,操作描述了每个光源和每个被照亮物体的表面上每个点的相关特性的数据。实际上,这是海量数据,而对于Celestia必须做出妥协。
在许多情况下,Celestia 使用图像作为“地图”来提供描述物体表面特性的必要信息。地图上的每个点对应于表面上的一个点。Celestia 使用图像文件来确定物体表面上对应点应该如何显示。这个过程被称为 **纹理映射**。如果你在这里看到了与你在学校熟悉的各种地图的类比,这并非巧合。术语 *地图* 在这里的使用与它的传统含义非常接近。
术语 *纹理* 在这个语境中可能看起来有点令人困惑。它来自早期计算机图形中该技术的原始用法。当时,由于硬件限制,只能使用非常小的图像,因此它们只能覆盖物体表面的一小部分。但是,一个小的图像可以重复使用来覆盖物体的大面积,使其具有纹理外观。Celestia 通常使用一个纹理图像来覆盖物体整个表面,其中一些物体是行星大小。技术已经发展了很长一段时间了!
由于纹理映射依赖于图像数据,我们将从简要回顾图像基本概念开始。数字图像本质上是一个称为像素(“图像元素”的缩写)的矩形网格。每个像素都有一个特定的数字值。像素值通常用于表示颜色,但可以用于任何类型的信息。任何像素可以具有的可能值的数目称为图像的“深度”。图像的深度通常表示为位的数目。提供的位数越多,数据表示的精度越高。图像的(空间)分辨率由它包含的像素行和列的数目决定。行和列越多,图像的分辨率就越高。不幸的是,像素行和列越多,每个像素的位数越多,存储图像所需的存储量就越大。图像文件格式通常包括压缩技术来减少存储需求,但这会导致信息丢失,从而导致质量下降。
由于纹理实际上是图片,因此你可以使用你喜欢的绘图程序来创建它们。通常,NASA 的公共领域照片可以作为假想星球表面纹理的起点。
通常最好在至少是 Addon 中提供分辨率的两倍的分辨率下工作。缩小后,结果看起来比你在最终分辨率下工作要好得多。此外,确保使用保留细节的图像格式保存你的中间结果。不要将 DDS 或 JPEG 格式用于除最终发布的产品以外的任何其他用途。
Celestia 支持三种纹理图像文件格式:PNG、JPEG 和 DDS。由于它们的特性不同,不同的文件格式更适合某些应用程序而不是其他应用程序。
PNG(便携式网络图形的缩写)是一种无损压缩格式,即它可以无变化地再现原始图像。PNG 图像可以包含一个 8 位 alpha 层,该层用于确定图像在何处透明(想想云层)。因为它提供完美的质量和 alpha 层,因此 PNG 可以用于 Celestia 的所有目的。但是它通常具有最大的文件大小,并且可能不适合用于下载的纹理。PNG 几乎所有除了最老的图像处理程序都支持。
JPEG(联合图像专家组首字母缩写词,通常缩写为 JPG)专为良好的视觉外观和高压缩比而设计。它引入了一些与原始图像相比的微小差异,但当使用默认或更好的质量保存 JPEG 图像时,这很少能看出来。JPEG 格式非常适合表面纹理,尤其是在必须保持文件大小很小的情况下,例如用于下载。几乎所有图像处理程序都支持 JPEG。不幸的是,JPEG 不支持 alpha 通道,因此它不能用于需要透明度的纹理。
DDS(Direct Draw Surface 的缩写)支持几种不同的专门格式。对于 Celestia 来说,最重要的是 DXT1、DXT3 和 DXT5。DDS 在几个方面不同于 JPEG 和 PNG,因为它不是通常用于存储图片的格式。相反,它是为 3D 硬件而设计的,可以直接加载到你的显卡中。非常老的显卡不支持 DDS 纹理,因此并非每个人都可以使用它们。在某些情况下,DDS 可能具有支持的图像格式中最差的质量,明显低于具有默认压缩的 JPEG。它也没有被高度压缩,例如 DXT1 的 1:6。
那么它为什么会被使用呢?因为 DDS 纹理的压缩即使在图像加载后也能起作用。以一个 2048x1024 的图像为例。当以 PNG 或 JPEG 格式存储时,图像在硬盘上可能占用很少的空间(JPEG 为 200 kB,PNG 为 1-2 MB),但一旦加载到内存中,它将扩展到 width*height*3 字节 = 6MB。DDS 图像在磁盘和内存中都只占用它的 1/6,因此您可以使用更多或更高分辨率的纹理而不影响性能。此外,DDS 图像不需要由 CPU 解压缩,因此加载速度也快得多。当接近尚未加载纹理的行星以及虚拟纹理时,这一点非常重要。
由于 DDS 纹理的质量相对较低,以及压缩造成的伪影,DDS 纹理通常不适合用于法线贴图。不过,Nvidia 定义了一种专门的法线贴图格式,它使用特殊的 DXT5 编码。Celestia 将这种格式称为 DXT5nm。
DDS 文件通常包含多个纹理图像,称为“mipmap”。它们是主图像的逐步降低分辨率的版本,由用于创建 DDS 文件的软件自动创建。图形硬件选择最适合屏幕上对象大小的 mipmap,从而最大限度地减少需要重新缩放的像素数量,从而提高图形帧速率。
(这里需要 DXT 格式的更多详细信息)
以下是 Celestia 使用的一些不同类型的纹理贴图
纹理就像表面的一张照片,看起来很像传统的世界地图。如果用作表面纹理的图像文件包含一个 Alpha 层(通常用于指示透明度),Celestia 会将此层用作对象的镜面纹理贴图。
JPG、PNG 或 DDS 镜面纹理控制行星表面的哪些部分看起来是光亮的,哪些部分看起来是不光亮的,从而使明亮的亮点被绘制出来。在纹理图像中,白色表示将显示亮点的区域。黑色表示没有亮点的区域。它可以非常有效地显示海洋行星上的水表面。
当使用 镜面纹理时,还必须指定 镜面颜色和 镜面强度。有关更多信息,请参见关于 SSC 目录文件 的章节。
镜面反射亮点仅在 Celestia 的 OpenGL 顶点程序和 OpenGL 2.0 渲染路径中可见。图形硬件必须支持 OpenGL v1.4 或更高版本。
法线贴图不是“正常”的,因为它不是传统意义上的地图。相反,它定义了表面法线向量:它包含关于纹理图像中每个点的表面斜率的信息。这使得 Celestia 可以在实际上是平滑的表面上绘制阴影,使其看起来像包含凹凸和折痕,因为有山脉和山谷。这通常比实际将陨石坑和山脉塑造成模型更容易。
法线贴图绘制的阴影仅在 Celestia 的 OpenGL 顶点程序和 OpenGL 2.0 渲染路径中可见。
在 天体物质网站 上可以找到创建这些法线贴图的工具。
凹凸贴图是 法线贴图的替代品。它指定了物体表面上位置的相对高度。对应于最高高度位置的像素被涂成白色,而最低高度位置的像素被涂成黑色。凹凸贴图通常由高度贴图创建。在内部,Celestia 将凹凸贴图转换为法线贴图。
当使用 凹凸贴图时,还必须指定 凹凸高度。
凹凸贴图绘制的阴影仅在 Celestia 的 OpenGL 顶点程序和 OpenGL 2.0 渲染路径中可见。
还要记住,纹理的黑白副本不是凹凸贴图,也不应作为凹凸贴图使用。凹凸贴图包含高度或海拔数据,而纹理是包含太阳造成的阴影的“照片”。
有关更多信息,请参见
云贴图是在表面 纹理上方绘制的透明或半透明图像,用于渲染云。云贴图必须以 png 或 dds(dtx3 或 dxt5)格式,并包含一个 Alpha 通道以提供其透明度。在 SSC 目录文件(对象的属性声明)中,可以定义云在地面上方的高度,以及云相对于表面纹理的移动速度。
如果 云贴图是虚拟纹理,云速度必须为 0,否则图像将显示为损坏。
此功能需要 Celestia v1.5.0 或更高版本。
云法线贴图在云图像表面添加阴影,使其看起来凹凸不平。
夜间纹理显示了物体夜侧的样子,包含城市、火山爆发、森林火灾等引起的灯光区域。它应该包含一个 Alpha 通道以允许通过夜间纹理看到表面纹理贴图,但这并不是必需的。
纹理图像的(空间)分辨率由它包含的像素行和列数决定。行和列越多,图像的分辨率越高。最重要的是,纹理分辨率越高,它包含的细节就越多,你可以从更近的距离观察它。如果你过近地观察纹理,它会显得模糊,因为它没有足够的细节。纹理分辨率越高,你可以从更近的距离观察它,并且可以看到更多细节。如果纹理映射到行星表面,行星的大小加上纹理的分辨率决定了你可以从哪个距离观察行星,并获得令人满意的视图。较大的行星将需要更高分辨率的图像才能在相同的观察距离提供可比的细节。
如果将多个具有相同名称但不同分辨率的图像放到以下子目录中,则可以使用多达三个图像作为纹理:textures/lores, textures/medres以及textures/hires. 然后可以使用键盘命令“r”和“R”在它们之间进行选择。
通常将纹理分辨率称为 1k、2k、4k、8k 等。
这意味着
- 1k 纹理的宽度为 1024 像素,高度为 512 像素
- 2k 纹理为 2048 x 1024 像素
- 4k 纹理为 4096 x 2048 像素
... 等等。
Celestia 中使用的任何纹理都必须在每一边都是 2 的幂,就像上面示例中显示的尺寸一样。此限制在 Celestia v1.5.0 中被解除,但对于支持“非 2 的幂”纹理大小的显卡来说效果最佳。Celestia 会缩小纹理以适合不支持该功能的显卡,这可能会严重损坏图像。
当纹理变得非常大时,将它分成更小的部分可能会更有利,从而创建一个虚拟纹理——这节省了 Celestia 绘制它所需的内存。
虚拟纹理是 Celestia 使用的一种特殊纹理格式,用于处理非常大的纹理。它由许多小纹理组成,这些小纹理显示了行星、卫星等的细微细节。
虚拟纹理有多个级别。这些级别从 0 到 10 编号(对于 v1.4.0 及更高版本,为 12)。级别 10 用于非常精细的细节,级别 0 基本上是全球视图,显示了 Celestia 世界的所有主要特征。级别 0 由 2 个图像组成,级别 10 可以由数千个特写图像组成,显示出极高的细节。
ctx 文件定义了虚拟纹理,它的文件名在 ssc 文件中引用虚拟纹理时使用。
有关创建虚拟纹理的详细信息,请参阅Celestia MotherLode上的文档。