起源引擎的著色器

著色器是在圖形處理器(Graphics Processing Unit, GPU)上執行的一套程式,用於確定應如何繪製物件。著色器替代了傳統的固定渲染管線,可以實現圖形計算中的渲染相關計算,由於其可編輯性,可以實現各種各樣的影象效果而不用受顯示卡的固定渲染管線限制。著色器曾只存在於離線渲染(如 電影工業)領域,而實時渲染領域的著色器則是在 Microsoft 推出 Shader Model(著色器模型) 後才被首次引入。

Source 3D渲染中的所有內容都使用基於著色器繪製的方法。

著色器根據儲存在 材質 檔案中的引數進行進一步工作,看似簡單,但裡面存有非常複雜的來處理 實時陰影 、 照明 和 折射 等效果的配置資訊。

目錄

1型別

2著色語言

3著色模型

4畫素著色器

4.1畫素著色器 示例

5頂點著色器

5.1頂點著色器 示例

6著色器在起源引擎中的應用

6.1後處理

6.2逐物件

7擴充套件連結 / Reference

7.1註釋

1.著色器型別

著色器(Shader)主要有頂點著色器(Vertex Shader)和畫素著色器(Pixel Shader)兩種。Source SDK 提供了大量現成的著色器。

2.著色語言

目前有三種主要的著色器語言:高階著色語言(HLSL),C for Graphics (Cg) 和 OpenGL 著色語言(GLSL)。Source 使用基於 HLSL 的著色器。HLSL 和 Cg 語言的語法基本相同,大多數 Cg 著色器都可以快速輕鬆地移植到 HLSL。

3.著色模型

Shader Model (以下簡稱 SM)是一種程式設計模型,直接地定義瞭如何使 GPU 執行高階著色技術,同時可以防止太老的 GPU 執行新著色技術的程式。(防止顯示卡爆炸) Source 支援 SM 2.0(包括 PS 2.0b)和 SM 3.0. 其中 SM 3.0 是一次巨大飛躍,支援浮點精度運算,是現代高畫質遊戲的基石。因此 Source 的 shader 本身具有極強的拓展性。

 注意: SM 3.0 的著色器可能無法在 macOS 和 Linux 系統上正常工作,因為 Valve 的轉接層 (DirectX To OpenGL) togl只支援 SM 3.0 的部分特性,如果想要著色器正常工作,你應該考慮做一個 SM 2.0b 標準的著色器。

 需證實:對於 vulkan_wrapper 的情況未知 ( Source 並不原生支援 Vulkan API, 只能通過 dxvk 進行轉譯。)

為較新的 GPU 建立著色器時,請務必記住去支援那些較舊 GPU 用的著色器,否則這樣會對老玩家產生很多限制。

舊的 GPU 可能需要“著色器回退 (shader fallbacks)”,如果新版 SM 用不了,那麼遊戲會使用舊版 SM。

4. 畫素著色器

每個被渲染的畫素都與畫素著色器有關。畫素著色器需要來自頂點的插值輸入,然後再用它來柵格化影象。畫素著色器可以產生涉及單個畫素顏色的大量效果,例如 折射 、逐畫素照明 和 反射 等等。

4.1 畫素著色器 示例

這裡我們提供一個畫素著色器示例,可以在 Source 中使用。此著色器旨在用作 Post-processing (即 後處理) ,並建立灰度值。

5. 頂點著色器

頂點著色器應用於 可程式設計管線(Programmable Pipeline) 上運作的每個 頂點(Vertex)。其最基本的功能是將幾何體轉換為 螢幕空間(Screen-Space) 座標,以便 畫素著色器 去柵格化影象。頂點著色器可以修改這些位置座標以執行網格變形。它們還可以從 網格(Mesh) 接收其他資訊,包括 法線、切線和紋理座標 , 然後頂點著色器就執行寫入 (輸出暫存器) 操作,再然後,在畫素著色器中的頂點之間對寫入的值進行插值。注意!頂點著色器 無法建立或銷燬頂點;它一次對單個頂點進行操作,將一個未處理的頂點作為輸入並輸出單個處理的頂點。

5.1 頂點著色器 示例

頂點著色器只是個搬運工, 它不會對頂點資料進行大改,只是會把資料送到畫素著色器階段罷了。

6. 著色器在起源引擎中的應用

Source 提供兩種不同形式的著色器,分別是 後處理型 和 逐物件型 ,Source 中的大多數特效和材質都非常非常依賴其畫素著色器元件。

6.1 後處理

後處理著色器通常是在螢幕內已經渲染好的四邊形的內容上工作的畫素著色器。這些四邊形會進一步被 Framebuffer 上的資料來被進行紋理處理,然後再送到畫素著色器來進一步渲染,輸出圖元后再建立各種效果,比如把一些基礎的顏色經過後處理管道來達到最佳效果,例如動態模糊(motion blur)和泛光(bloom)。

注:某些檔案已不再包含在 SDK 中。

高階的後期處理著色器[如動態模糊(motion blur)和泛光(bloom)的著色器]可能還需要使用自定義 RenderTarget。有關將後處理著色器與模組整合的更多資訊,請參閱 Custom_Postprocessing_Effects

6.2 逐物件處理

Source 中的逐物件著色器適用於具有 Valve 材質 (.vmt) 中引用的著色器的任何物件,比如 模型,筆刷 等。逐物件著色器可用於建立折射材質、動態地修改模型頂點或其他高階渲染效果。

Source SDK 同時也提供逐物件著色器的示例[在光照貼圖(lightmap)裡] (sdk_lightmap.cppsdk_lightmap_vs20.fxcsdk_lightmap_ps20.fxc)

7. 擴充套件連結 / Reference

A bluffer's guide to Shader Models

NVIDIA - The Cg tutorial

NVIDIA - GPU Gems

NVIDIA - GPU Gems 2

NVIDIA - GPU Gems 3

Shader - Wikipedia

Introduction to Shaders Tutorial from Wraiyth

Post-Process Shader Tutorial from Wraiyth

隨便看看 更多