1. 什么是渲染路徑(Rendering Path)?
????在Unity中,渲染路徑決定了光照是如何應用到Unity Shader中的。因此,如果要和光源打交道,就要為每個Pass指定它的渲染路徑。
????相當于跟Unity約定某種規則,我要使用這種渲染路徑,那么Unity會根于約定的規則,把相應的數據放到對應的位置。
????只有為Shader正確的設置了渲染路徑,該Shader的光照計算才能被正確執行。
????大多數情況下,一個項目只使用一種渲染路徑。
2. Unity有哪些渲染路徑?
????Unity5.0之后,
????前向渲染路徑(Forward Rendering Path):是傳統的渲染方式,也是最常用的一種。
????延遲渲染路徑(Deferred Rendering Path)
3. 前向渲染路徑原理是什么?
Pass{
????for( each primitvie in this model){
????????for( each fragment coverd by this primitive){
????????????if( failed in depth test){
????????????????/// 如果沒有通過深度測試,說明該片元不可見
????????????????discard;
????????????}else{
????????????????/// 如果該片元可見,進行光照計算
????????????????float4 colro = Shading(materialInfo, pos, normal, lightDir, viewDir)
????????????????/// 更新幀緩沖
????????????????writeFrameBuffer( fragment, color );
????????????}
????????}
????}
}
4. 前向渲染有幾種?
????有兩種。
????Base Pass:會計算環境光,最重要的平行光,逐頂點/SH光源和Lightmaps。
????Additional Pass:會計算額外的逐像素光源,每個Pass對應一個光源。
5. 前向渲染路徑有什么問題?
????當場景中包含大量實時光源時,前向路徑的性能就會急劇下降。
????假設場景中有N個物體,每個物體受到M個光源的影響,那么要渲染整個場景,就需要N*M個Pass。因此,如果逐像素光照比較多,那么Pass就會很大。而每執行一個Pass,就需要重新渲染一遍物體,但很多計算是重復的。
6. 為什么要使用延遲渲染路徑?
????除了前向渲染路徑中的顏色緩沖和深度緩沖外,延遲渲染還會利用額外的G緩沖(G-buffer)。G-buffer存儲了我們關心的表面的其他信息,例如該表面的發現,位置,用于光照計算的材質屬性等。
6. 延遲渲染路徑的原理是什么?
Pass1{
????/// 第一個Pass不進行真正的光照計算,僅僅把光照計算需要的信息存儲到G-buffer中
????for(each primitive in this model){
????????for(each fragment covered by this primitive){
????????????if( failed in depth test ){
????????????????/// 如果沒有通過深度測試,說明該片元是不可見的
????????????????discard;
????????????}else{
????????????????/// 如果該片元可見,那就把重要的信息存儲到G-buffer中
????????????????writeGBuffer( materialInfo, pos, normal );
????????????}
????????}
????}
}
Pass2{
????/// 利用G-buffer中的信息進行真正的光照計算
????for( each pixel in this screen ){
????????if( the pixel is valid ){
????????????????/// 如果該像素是有效的,讀取它對應的G-Buffer中的信息
????????????????readGBuffer( pixel, materialInfo, pos, normal );
????????????????/// 根據讀取到的信息進行光照計算
????????????????float4 color = Shading( materialInfo, pos, normal, lightDir, viewDir);
????????????????/// 更新幀緩沖區。
????????????????writeFrameBuffer( pixel, color );
????????????}
????????}
}
7. 延遲渲染的再理解
????從上面可見,延遲渲染使用的Pass就是兩個,跟場景中光源數目無關。也就是說,延遲渲染的效率不依賴于場景的復雜度,而是跟屏幕空間的大小相關。所以,它適用于場景中光源數目多,使用前向渲染會造成性嗯呢該瓶頸的情況下使用,而且,延遲渲染路徑中每個光源都可以按照逐像素的方式處理。
????延遲渲染的意思就是,把光照計算延遲到第2個Pass來進行計算。
8. 延遲渲染那么牛逼,那都用延遲渲染不就行了嗎,為什么還要有前向渲染?
????延遲渲染有自己的缺點:不支持真正的抗鋸齒功能;不能處理半透明物體;對顯卡有一定要求;
9. 其他
????當然還有其他渲染路徑,頂點渲染路徑(5.0后已被拋棄,其實是前向渲染路徑的子集),遺留的延遲渲染路徑等。自己根據需要去查看。
????另外,因為不同的渲染路徑跟Unity約定了不同的數據存放方式,所以,具體用到哪個渲染路徑的時候,再去查看就可以了。我記不住。。。
10. 怎么選擇渲染路徑
????根據自己游戲的需求來進行選擇。
????另外,如果當前顯卡不支持所選的渲染路徑,那么Unity會自動使用比其低一級的渲染路徑。