Unity Shaders簡介

原文地址

在本文中,我將對shader是啥做個基本介紹,討論Unity渲染管道的基礎並給讀者介紹如何使用unity遊戲引擎中的shader.

簡介

shader廣泛用於視頻遊戲中,用於產生很多變化效果,如光照模型,扭曲,(運動)模糊,發光(bloom)和邊緣檢測效果.着色語言(shading language)用於圖形處理單元(GPU)編程並允許用戶設置圖形硬件來渲染而不是固定功能管道渲染.常用的shader類型有3種:頂點着色器(Vertex Shader),片段着色器(Fragment Shader)和幾何着色器(Geometry Shader).

在Unity中用戶能夠編寫自定義shader,然而全屏效果需要的渲染材質只在Unity Pro中才提供,本文中不會涉及它.這些全屏圖形處理效果本身就是很高深的話題.由於要涉及到很多材料,我不會在編寫自定義shader效果上討論太深而主要着重於shader是什麼以及如何在unity中使用它們.

Unity中的shader

在Unity中所有的渲染都是通過shader進行的.Unity中的shader是些短小的腳本,它們允許用戶配置顯卡如何爲渲染而設置.Unity本身帶有超過60種的內置shader,通過使用材質來使用這些shader.在Unity中材質和shader間的關係很密切.shader包含代碼,這些代碼定義了使用哪種資源(asset)與屬性.同時材質允許用戶調整屬性並賦予資源(assets).例如,如果我們創建一個新的GameObject並給其賦予一個材質,我們可以從檢視器(Inspector)中選擇一個shader,這個shader指定了在遊戲運行時材質的外觀.材質的屬性根據用於渲染GameObeject的shader而不同.

在Unity中書寫shader有3種方式:固定功能着色器(Fixed Function Shaders),頂點和片段着色器(Vertex and Fragment Shaders)和表面着色器(Surface Shaders).這些着色器的代碼使用Unity裏被稱作"ShaderLab"的着色和材質語言封裝起來.shader本身通常使用CG或者HLSL着色器語言.

表面着色器(Surface Shaders)

表面着色器很常用於shader需要同時被燈光和陰影影響的情況下.既然着色器需要受燈光影響,你不想每次都爲處理默認BlinnPhong光照模型寫出完整的着色器代碼.這允許用戶用一種更簡潔的方式編寫複雜的着色器.如果着色器不與光照相互影響(interact)那麼最好使用頂點和片段寄存器來替代.否則Unity在我們不需要它們的時候還會進行光照計算.<todo>

頂點和片段着色器

如果着色器無需與燈光互相影響或者你想弄一個表面着色器不能處理的效果此時頂點和片段着色器就派上用場了.它們是用於創建着色器效果最靈活的着色器,不過它使得與光照交互變得有點難.

固定功能着色器(Fixed Function Shaders)

固定功能着色器用於不支持可編程着色器的硬件.固定功能着色器常作爲最後的備用方案來確保當圖形處理單元(gpu)不支持特定着色器效果時遊戲仍然在渲染一些有意義的東西.固定功能着色器完全使用Unity裏的"ShaderJob"編寫.我們稍後會更加詳細的探討它.

Unity的渲染管道

使用着色器我們可以定義我們的工程在我們的遊戲世界裏如何呈現以及它如何影響光照(react to lighting).這些燈光如何影響物體取決於着色器的管道與它使用的渲染路徑(rendering path).渲染路徑可以通過Unity的播放器設置改變.或者在檢視器(inspector)中camera的'Rendering Path'設置中被覆蓋.在Unity中有3中渲染路徑:Vertex Lit,Forward Rendering和Deferred Rendering.如果顯卡不能處理當前所選的渲染路徑則會返回(fallback)使用另一種.所以如果顯卡不支持延遲渲染(deferred rendering),Unity會自動使用前置渲染(Forward Rendering).如果不支持你前置渲染則將會切換到Vertex Lit.由於所有的着色器都受所設置渲染路徑的影響,我簡單的描述一下每個渲染路徑都是做啥的.

Vertex Lit

Vertex Lit是可用的最簡單的光照模型.它不支持實時陰影.它常用於硬件受限的老電腦上.在內部(internally)它將從一個管道中物體頂點的所有燈光值來計算光照值(這句很拗口,原文是Internally it will calculate lighting from all lights at the object vertices in one pass).因爲光照是在逐頂點級別上處理的,逐像素效果是不支持的.

前置渲染(Forward Rendering)

前置渲染根據影響物體的燈光在一個或多個管道中渲染每個物體.根據燈光設置與用戶光照強度設置所有的燈光差別對待(treated differently)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章