複雜的光照

2021-10-20 18:24:14 字數 2912 閱讀 7052

渲染路徑主要用於和光源打交道,shader編寫中需要為pass指定渲染路徑,這樣unity才會明白程式設計師想要使用的渲染路徑,然後將光源和處理後的光照資訊放到這些資料裡,程式設計師才能在著色器中進行訪問。

大多數情況下,乙個專案只使用一種渲染路徑,因此我們可以為整個專案設定渲染時的渲染路徑。在unity的edit->project settings->player->other settings->rendering path中選擇專案所需的渲染路徑。預設情況下,該選擇的是前向渲染路徑。

但乙個攝像機下可指定不同的渲染路徑,同樣在rendering path下指定。

利用pass標籤下的lightmode來指定渲染路徑,eg:

pass

上面的**將告訴unity,該pass將使用前向渲染路徑中的forwardbase路徑。

lightmode標籤支援的渲染路徑設定選項

標籤名描述always

不管使用哪種渲染路徑,該pass總是會被渲染,但不會計算任何光照

forwardbase

用於前向渲染,該pass會計算環境光,最重要的平行光,逐頂點/sh光源和lightmaps

forwardadd

用於前向渲染。該pass會計算額外的逐畫素光源,每個pass對應乙個光源

deferred

用於延遲渲染。該pass會渲染g緩衝(g-buffer)

shadowcaster

把物體的深度資訊渲染到陰影對映紋理(shadowmap)或一張深度紋理中

prepassbase

用於遺留的延遲渲染。該pass會渲染法線和高光反射的指數部分

prepassfinal

用於遺留的延遲渲染。該pass通過合併紋理、光照和自發光來渲染得到最後的顏色

vertex、vertexmrgbm和vertexlm

用於遺留的頂點照明渲染

使用渲染路徑的主要作用是為unity內建的光照變數進行正確的賦值。

原理:每進行一次完整的前向渲染路徑,我們需要渲染該物件的渲染圖元,並計算兩個緩衝區資訊:乙個是顏色緩衝區,乙個是深度緩衝區,深度緩衝區決定乙個片元是否可見,如果可見再更新顏色緩衝區中的顏色值。

前向渲染三種處理光照的方式:

1. 逐頂點處理

2. 逐畫素處理

3. 球鞋函式處理(sh處理)

決定乙個光源使用哪種處理模式取決於它的型別和渲染模式。光源型別是指該光源是平行光還是點光源還是其他型別的光源。而光源的渲染模式指的是該光源是否是重要的。

unity實際處理光源使用的判斷規則如下:

前向渲染兩種pass**:(basepass和additional pass)

延遲渲染

在前向渲染下的場景中光源數目較多造成效能瓶頸的情況下使用

原理:延遲渲染主要包含個pass。在第乙個pass中,我們不進行任何光照計算,而是僅僅計算哪些片元是可見的,這主要是通過深度緩衝技術來實現,當發現乙個片元是可見的,我們就把它的相關資訊儲存到g緩衝區中。然後,在第二個pass中,我們利用g緩衝區的各個片元資訊,例如表面法線,視角方向,漫反射係數來進行真正的光照計算。

偽**:

pass 1else}}

}pass 2

}}

延遲渲染使用的pass數目通常就是兩個,這跟場景中包含的光源數目是沒有關係的。所以延遲渲染的效率不依賴於場景的複雜度,而是和我們使用的螢幕空間的大小有關。這是因為,我們需要的資訊都儲存在緩衝區中,而這些緩衝區可以理解成一張張2d影象,我們的計算實際上就是在這些影象空間中進行的。

使用延遲渲染的注意事項:

光源的型別:

shader**:

shader "custom/chapter9-forwardrendering"

subshader

cgprogram

//使用該指令能確保使用光照衰減等光照變數能被正確賦值

#pragma multi_compile_fwdbase

#pragma vertex vert

#pragma fragment frag

#include "lighting.cginc"

fixed4 _diffuse;

fixed4 _specular;

float _gloss;

struct a2v;

struct v2f;

v2f vert(a2v v)

fixed4 frag(v2f i):sv_target

endcg

}//additional pass

pass

//設定混合模式

blend one one

cgprogram

//使用該指令能確保使用光照衰減等光照變數能被正確賦值

#pragma multi_compile_fwdadd

#pragma vertex vert

#pragma fragment frag

#include "lighting.cginc"

#include "autolight.cginc"

fixed4 _diffuse;

fixed4 _specular;

float _gloss;

struct a2v;

struct v2f;

v2f vert(a2v v)

fixed4 frag(v2f i):sv_target

endcg}}

fallback "diffuse"

}

unity Shader複雜光照

一 渲染路徑 1 unity支援的渲染路徑 前向渲染路徑 forword 延遲渲染路徑 deferred 頂點照明渲染路徑 vertex lit 2 可以在專案上設定 也可以在攝相機上設定或者在shader上設定,在shader上利用lightmode標籤實現。3 pass的lightmode標籤支...

Shader筆記9 更複雜的光照 四種渲染路徑

總結unity5.0版本之前,有3中渲染路徑 設定整個專案的渲染路徑 edit project srtting player other setting rendering path 中選擇專案所需的渲染路徑 使用多個渲染路徑,可以讓攝像機覆蓋project setting中的設定 若當前顯示卡並不...

簡單光照模型(Lambert 光照模型)

環境光是對光照現像的最簡單抽象,因而侷限性很大。它僅能描述光線在空間中無方向並均勻散布時的狀態。很多情況下,入射光是帶有方向的,比如典型的陽光。如果光照射到比較粗糙的物體表面,如粉筆,由於這些表面從各個方向等強度地反射光,因而從各個視角出發,物體表面呈現相同的亮度,所看到的物體表面某點的明暗程度不隨...