起源引擎的著色器
著色器是在圖形處理器(Graphics Processing Unit, GPU)上運行的一套程序,用于確定應(yīng)如何繪制對象。著色器替代了傳統(tǒng)的固定渲染管線,可以實現(xiàn)圖形計算中的渲染相關(guān)計算,由于其可編輯性,可以實現(xiàn)各種各樣的圖像效果而不用受顯卡的固定渲染管線限制。著色器曾只存在于離線渲染(如?電影工業(yè))領(lǐng)域,而實時渲染領(lǐng)域的著色器則是在 Microsoft 推出 Shader Model(著色器模型) 后才被首次引入。
Source 3D渲染中的所有內(nèi)容都使用基于著色器繪制的方法。
著色器根據(jù)存儲在?材質(zhì)?文件中的參數(shù)進行進一步工作,看似簡單,但里面存有非常復(fù)雜的來處理?實時陰影?、?照明?和?折射?等效果的配置信息。
目錄
1類型
2著色語言
3著色模型
4像素著色器
4.1像素著色器 示例
5頂點著色器
5.1頂點著色器 示例
6著色器在起源引擎中的應(yīng)用
6.1后處理
6.2逐對象
7擴展鏈接 / Reference
7.1注釋
1.著色器類型
著色器(Shader)主要有頂點著色器(Vertex Shader)和像素著色器(Pixel Shader)兩種。Source?SDK 提供了大量現(xiàn)成的著色器。
2.著色語言
目前有三種主要的著色器語言:高階著色語言(HLSL),C for Graphics (Cg) 和 OpenGL 著色語言(GLSL)。Source 使用基于 HLSL 的著色器。HLSL 和 Cg 語言的語法基本相同,大多數(shù) Cg 著色器都可以快速輕松地移植到 HLSL。
3.著色模型
Shader Model (以下簡稱 SM)是一種編程模型,直接地定義了如何使 GPU 運行高階著色技術(shù),同時可以防止太老的 GPU 運行新著色技術(shù)的程序。(防止顯卡爆炸)?Source?支持 SM 2.0(包括 PS 2.0b)和 SM 3.0.?其中 SM 3.0 是一次巨大飛躍,支持浮點精度運算,是現(xiàn)代高畫質(zhì)游戲的基石。因此 Source 的 shader 本身具有極強的拓展性。
?注意:?SM 3.0 的著色器可能無法在 macOS 和 Linux 系統(tǒng)上正常工作,因為 Valve 的轉(zhuǎn)接層 (DirectX To OpenGL)?togl
只支持 SM 3.0 的部分特性,如果想要著色器正常工作,你應(yīng)該考慮做一個 SM 2.0b 標(biāo)準(zhǔn)的著色器。
?需證實:對于 vulkan_wrapper 的情況未知 (?Source?并不原生支持 Vulkan API, 只能通過?dxvk
?進行轉(zhuǎn)譯。)
為較新的 GPU 創(chuàng)建著色器時,請務(wù)必記住去支持那些較舊 GPU 用的著色器,否則這樣會對老玩家產(chǎn)生很多限制。
舊的 GPU 可能需要“著色器回退 (shader fallbacks)”,如果新版 SM 用不了,那么游戲會使用舊版 SM。
4. 像素著色器
每個被渲染的像素都與像素著色器有關(guān)。像素著色器需要來自頂點的插值輸入,然后再用它來柵格化圖像。像素著色器可以產(chǎn)生涉及單個像素顏色的大量效果,例如?折射?、逐像素照明?和?反射?等等。
4.1 像素著色器 示例
這里我們提供一個像素著色器示例,可以在 Source 中使用。此著色器旨在用作 Post-processing (即?后處理) ,并創(chuàng)建灰度值。

5. 頂點著色器
頂點著色器應(yīng)用于?可編程管線(Programmable Pipeline)?上運作的每個?頂點(Vertex)。其最基本的功能是將幾何體轉(zhuǎn)換為?屏幕空間(Screen-Space)?坐標(biāo),以便?像素著色器?去柵格化圖像。頂點著色器可以修改這些位置坐標(biāo)以執(zhí)行網(wǎng)格變形。它們還可以從?網(wǎng)格(Mesh)?接收其他信息,包括?法線、切線和紋理坐標(biāo)?, 然后頂點著色器就執(zhí)行寫入?(輸出寄存器)?操作,再然后,在像素著色器中的頂點之間對寫入的值進行插值。注意!頂點著色器 無法創(chuàng)建或銷毀頂點;它一次對單個頂點進行操作,將一個未處理的頂點作為輸入并輸出單個處理的頂點。
5.1 頂點著色器 示例
頂點著色器只是個搬運工, 它不會對頂點數(shù)據(jù)進行大改,只是會把數(shù)據(jù)送到像素著色器階段罷了。

6. 著色器在起源引擎中的應(yīng)用
Source 提供兩種不同形式的著色器,分別是?后處理型?和?逐對象型?,Source 中的大多數(shù)特效和材質(zhì)都非常非常依賴其像素著色器組件。
6.1 后處理
后處理著色器通常是在屏幕內(nèi)已經(jīng)渲染好的四邊形的內(nèi)容上工作的像素著色器。這些四邊形會進一步被 Framebuffer 上的數(shù)據(jù)來被進行紋理處理,然后再送到像素著色器來進一步渲染,輸出圖元后再創(chuàng)建各種效果,比如把一些基礎(chǔ)的顏色經(jīng)過后處理管道來達到最佳效果,例如動態(tài)模糊(motion blur)和泛光(bloom)。
注:某些文件已不再包含在 SDK 中。
高級的后期處理著色器[如動態(tài)模糊(motion blur)和泛光(bloom)的著色器]可能還需要使用自定義?RenderTarget。有關(guān)將后處理著色器與模組集成的更多信息,請參閱?Custom_Postprocessing_Effects
6.2 逐對象處理
Source 中的逐對象著色器適用于具有?Valve 材質(zhì) (.vmt)?中引用的著色器的任何對象,比如 模型,筆刷 等。逐對象著色器可用于創(chuàng)建折射材質(zhì)、動態(tài)地修改模型頂點或其他高級渲染效果。
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