跳轉到內容

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 紋理貼圖型別

[編輯 | 編輯原始碼]

以下是 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上的文件。

華夏公益教科書