Unity的渲染管线
Unity的渲染管線
英文原文:https://docs.unity3d.com/Manual/SL-RenderPipeline.html
著色器定義了對象的視覺效果(通過材質(zhì)屬性設(shè)置)以及對象如何與光線產(chǎn)生反應(yīng)。因為光照計算必須內(nèi)置到著色器中,而且光源與陰影的種類可能有很多種,所以編寫能夠“干活”的優(yōu)質(zhì)著色器是一項復(fù)雜的任務(wù)。為了使這一任務(wù)更加簡單,Unity內(nèi)置了表面著色器(Surface Shader),它能自動處理全部的照明、投影、光照映射、Forward與Deferred渲染。
這篇文章描述了Unity的照明與渲染管線的特異性以及發(fā)生在使用了表面著色器的場景底層的事情。
渲染通道(Rendering Path)
如何應(yīng)用照明以及使用著色器的哪個Pass取決于所使用的渲染通道。著色器中的每個Pass通過Pass Tag與它們的照明類型進(jìn)行通訊。
- 在Forward Rendering中,使用的Pass是 ForwardBase 和 ForwardAdd 。
- 在Deferred Shading中,使用的Pass是 Deferred 。
- 在Legacy Deferred Lighting中,使用的Pass是 PrepassBase 和 PrepassFinal 。
- 在Legacy Vertex Lit中,使用的Pass是 Vertex ,VertexLMRGBM 和 VertexLM 。
- 上述所有情形在渲染陰影(Shadows)或者深度紋理(Depth Texture)時,使用的Pass都是 ShadowCaster 。
Forward Rendering通道
ForwardBase 同時渲染環(huán)境光(Ambient)、光照貼圖(Lightmap)、主平行光(Directional Light)和Render Mode為Not Important(Vertex/SH)的光源。ForwardAdd 用于處理所有附加的Per-Pixel光源;每個通過此類光源照亮的物體都會產(chǎn)生一次調(diào)用(?:one invocation per object illuminated by such light is done)。
如果選用了Forward Rendering但著色器卻沒有適用于Forward Rendering的(Forward-suitable) Pass(例如,既沒有 ForwardBase 也沒有 ForwardAdd ),那么對象的渲染結(jié)果會和使用 Vectex Lit通道時一樣,參見下文。
Deferred Shading通道
Deferred 渲染照明所需要的所有信息(在內(nèi)置著色器中:diffuse color, specular color, smoothness, world space normal, emission),它也負(fù)責(zé)把光照貼圖、反射探針和環(huán)境光照添加到Emission Channel中。
Legacy Deferred Lighting通道
PrepassBase 渲染法線&反射指數(shù);PrepassFinal 通過合并紋理、照明&發(fā)光材質(zhì)屬性來渲染最終顏色。場景內(nèi)所有的常規(guī)照明都在屏幕空間內(nèi)分別完成。
Legacy Vertex Lit Rendering通道
自從頂點(diǎn)照明(Vertex Lighting)成為在不支持可編程著色器的平臺上使用最多的方式后,Unity無法再在內(nèi)部創(chuàng)建多個著色器變體來處理由光照貼圖 vs. 無光照貼圖的情況。因此,必須明確的編寫多個Pass來處理有光照貼圖和無光照貼圖的對象。
- Vertex Pass用于處理無光照貼圖的對象。所有光源一次性渲染,使用固定功能的 OpenGL/Direct3D 照明模型(Blinn-Phong)。
- VertexLMRGBM Pass用于處理光照貼圖使用RGBM編碼(PC和主機(jī))的對象。不應(yīng)用實時照明;Pass要合并紋理到光照貼圖(?:pass is expected to combine textures with a lightmap)。
- VertexLMM Pass用于處理光照貼圖使用 Double-LDR編碼(移動平臺)的對象。不應(yīng)用實時光照;Pass要合并紋理到光照貼圖(原文同上)。
參考
- 圖形指令緩沖器 - 擴(kuò)展Unity渲染管線
總結(jié)
以上是生活随笔為你收集整理的Unity的渲染管线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言,环形队列
- 下一篇: 空间换时间,查表法的经典例子