原文鏈接:https://docs.unity3d.com/Manual/SL-RenderPipeline.html
? ? ? ? shader定義了這個(gè)物體它自己看上去是什么樣的(它的材質(zhì)屬性),以及它是怎樣與光線交互的。由于光照計(jì)算的shader必須被放在shader中,并且有許多光影類型,寫一個(gè)“可以工作”質(zhì)量的shader將會(huì)是復(fù)雜的。為了使其更簡(jiǎn)單,Unity有表面shader,所有的光照,陰影,光照貼圖,正向或延遲渲染這些都會(huì)被自動(dòng)考慮到。
? ? ? ? 本文檔描述了Unity的光照和渲染流水線的特性以及表面shader幕后發(fā)生的事情。
渲染路徑
? ? ? ? 光照怎樣被應(yīng)用,并且shader的哪個(gè)pass會(huì)被使用,都基于使用什么渲染路徑。一個(gè)shader中的每個(gè)pass都通過pass tag來得到其光照類型。
·在正向渲染中,F(xiàn)orwardBase和ForwardAdd的pass將會(huì)被使用。
·在延遲著色中,Deferred的pass將會(huì)被使用。
·在舊延時(shí)光照中,PrepassBase和PrepassFinal的pass將會(huì)被使用。
·在舊頂點(diǎn)光照中,Vertex,VertexLMRGBM和VertexLM的pass將會(huì)被使用。
·在上面所有情況,要渲染陰影或是深度紋理,ShadowCaster的pass將會(huì)被使用。
正向渲染路徑
? ? ? ? ForwardBase的pass一次渲染環(huán)境光,光照貼圖,主平行光和不重要的光照(vertex/SH)。ForwardAdd的pass被用于渲染所有額外的逐像素光照;每個(gè)物體被這種光照射完成一次調(diào)用??凑蜾秩荆ㄦ溄右娫W(wǎng)頁(yè))獲取更多細(xì)節(jié)。
? ? ? ? 如果正向渲染被使用,但是一個(gè)shader并沒有正向渲染適配的pass(比如沒有ForwardBase和ForwardAdd的pass呈現(xiàn)類型),那么對(duì)象的渲染就會(huì)像頂點(diǎn)光照路徑一樣,請(qǐng)看下文。
延遲著色路徑
? ? ? ? 延遲的pass渲染光照所需的所有信息(在內(nèi)置的shader中:漫反射顏色,高光反射顏色,平滑度,世界空間法線,自發(fā)光)。它也在自發(fā)光通道中增加了光照貼圖,反射探針和環(huán)境光照。查看延遲著色以獲取更多細(xì)節(jié)(鏈接見原網(wǎng)頁(yè))。
舊延遲光照路徑
? ? ? ? PrepassBase的pass渲染法線和高光指數(shù),PrepassFinal的pass渲染通過紋理合并、光照和發(fā)光的材質(zhì)屬性得來的最終顏色。所有常規(guī)的場(chǎng)景中照明都在屏幕空間中單獨(dú)完成。查看延遲光照獲取更多細(xì)節(jié)(鏈接見原網(wǎng)頁(yè))。
舊頂點(diǎn)光照渲染路徑
? ? ? ? 由于頂點(diǎn)光照大多數(shù)情況下用于不支持可編程shader的平臺(tái),Unity不能創(chuàng)建多個(gè)內(nèi)部shader變體來處理光照貼圖與非光照貼圖的情況。所以處理光照貼圖與非光照貼圖的物體,必須明確的寫多個(gè)pass。
·Vertex的pass用于非光照貼圖的物體,所有光照馬上被渲染,使用OpenGL/Direct3D固定的光照模型函數(shù)(Blinn-Phong)。
·VertexLMRGBM的pass用于光照貼圖的物體,當(dāng)光照貼圖是RGBM編碼的時(shí)候(PC和控制臺(tái))。不會(huì)使用實(shí)時(shí)光照,pass被期望于合并紋理和光照貼圖。
·VertexLMM的pass用于光照貼圖的物體,當(dāng)光照貼圖是double-LDR編碼的時(shí)候(移動(dòng)平臺(tái))。不會(huì)使用實(shí)時(shí)光照,pass被期望于合并紋理和光照貼圖。
也可以看看
? ? ? ? Graphics Command Buffers(鏈接見原網(wǎng)頁(yè))講述怎樣擴(kuò)展Unity的渲染流水線。