8個問題輕松掌握Unity前向渲染
版權(quán)申明:
本文為“優(yōu)夢創(chuàng)客”原創(chuàng)文章,您可以自由轉(zhuǎn)載,但必須加入完整的版權(quán)聲明
更多學(xué)習(xí)資源請加QQ:1517069595獲?。ㄆ髽I(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項目實戰(zhàn)/每周直播/一對一指導(dǎo))
本文視頻鏈接:8個問題輕松掌握Unity前向渲染
引言
? 今天想給大家分享的主題是8個問題輕松掌握Unity前向渲染。網(wǎng)上的很多資料或多或少講到了前向渲染的用法,卻沒有講到根本的問題:前向渲染路徑是用來干什么的?它是用來解決什么樣的圖形問題?Unity為什么要在引擎中集成前向渲染路徑這種光照渲染的解決方案?
? 這里做下自問自答,前向渲染路徑是Unity為了解決多光源條件下,正確表現(xiàn)多光源光照效果而設(shè)置的一種解決方案。大家都知道多光源環(huán)境效果是很復(fù)雜的,首先要考慮多種不同的光源類型,還需要考慮諸如光源數(shù)量,不同光源效果的疊加,以及由于這些光源效果的疊加,所產(chǎn)生的陰影效果的疊加,最后還需要考慮進行全局光照的烘培和全局實時光照的渲染,需要讓逐色器/渲染程序適配前向渲染引擎,設(shè)計來解決多光源環(huán)境下前向渲染的解決方案。
? 下面我就以技術(shù)問答的形式,為大家詳解前向渲染的前世今生。只有我們理解了這種渲染路徑的設(shè)計思路,才能把前向渲染正確地運用在項目之中;相反的,對于程序同學(xué),如果不能正確使用前向渲染,對于程序的性能所造成的損失是無法估量的。對于技術(shù)美術(shù)同學(xué),如果不能正確考慮光照的各種因素,正確地開發(fā)基于前向渲染的Shader,也不能稱之為合格的技術(shù)美術(shù)。
? 今天的課程同時適用于,有一定Unity基礎(chǔ)想進階游戲開發(fā)主程的同學(xué),也適用于想要從Unity基礎(chǔ)的美術(shù)開發(fā)進階游戲技術(shù)美術(shù)的同學(xué)。
8個問題輕松掌握Unity前向渲染
主題: 什么是前向渲染路徑 如何正確理解和運用前向渲染路徑 如何在前向渲染路徑下實現(xiàn)光照效果
1。 場景內(nèi)有多盞燈光,應(yīng)該如何渲染每盞燈光對物體的影響?
大家可以假設(shè)你要去做一個游戲引擎,這個引擎需要考慮場景內(nèi)多盞燈光對一個物體照射的情況,每盞燈光都會對這個物體造成影響,你會怎樣設(shè)置引擎的算法呢?
前向渲染的解決方案是:把每個物體用每盞燈光渲染一邊,再將渲染結(jié)果混合起來
2。 Unity有幾種光照渲染模式?

首先給大家看個圖,大家覺得圖上左右兩邊哪個更細(xì)膩呢?實際上右邊的光照效果更細(xì)膩些。在藍(lán)色燈光和紅色燈光的過渡細(xì)節(jié)比較豐富。而左邊的圖在地面上所呈現(xiàn)的光照并沒有亮暗的變化,在藍(lán)色和白色的交界處,細(xì)節(jié)也很不明顯。
? 實際上這就反映了Unity中兩種不同的光照渲染模式:逐像素和逐頂點。
? 而另一種渲染方式球諧函數(shù)的光照渲染效果更差,采樣率更低。
總結(jié):Unity對物體進行光照渲染的時候有三種方式:逐像素/逐頂點/球諧函數(shù)
3。 每種渲染方式的性價比如何?

? 逐像素的效果最好,逐頂點次之,球諧函數(shù)最差。性能開銷則反之。
3。1 逐像素/逐頂點光照在前向路徑種的渲染算法

逐頂點分別計算三角形三個頂點的光照值,三角形最后呈現(xiàn)的顏色通過顏色差值進行過渡。逐像素一個像素一個像素渲染,效果比逐頂點精細(xì)得多。
對模型中的每一個三角形,三角形中的每一個片元進行運算,進行深度測試判斷像素點是否需要運算,如果需要就進行光照運算。傳入一些物體的材質(zhì)信息、法線信息、光照信息、攝像機方向的信息等,算出一個顏色,最后更新到幀緩存中。
逐頂點 就是將片元運算 改為頂點運算
4。 Unity對每盞燈光都采用逐像素渲染嗎?

以上圖為例,我們假設(shè)八盞燈光都可以照射到這個白球上。如果場景里有2個物體,那么需要渲染8X2遍;3個物體8X3遍。。。。100個物體8X100遍,這樣渲染顯然是不可能的。
實際上Unity不會每盞燈光都去逐像素渲染,而是允許我們在項目設(shè)置里設(shè)置下最大允許像素光數(shù)量。默認(rèn)設(shè)置為4盞,一般在開發(fā)手機游戲等商業(yè)項目時,我們僅設(shè)置為1盞,甚至通過優(yōu)化和替代的方式,設(shè)置為0盞。以得到更低的性能開銷和更好的渲染效果。
5。 Unity如何確定哪些燈光是逐像素的?

Unity是通過參加光照的燈光照到物體表面的亮度來確定哪些燈光是需要逐像素渲染的。
以上圖為例,A-H八盞燈光亮度相等的情況下,假設(shè)設(shè)置了4盞像素光的話,很顯然ABCD會作為逐像素進行渲染。
6。 頂點光照也有一定開銷,Unity在這塊有沒有限制

那么剩下的燈光會怎么進行渲染呢?我們知道Unity還有逐頂點和球諧函數(shù)兩種渲染方式。球諧函數(shù)的性能開銷幾乎可以忽略不記,但是逐定點是有性能開銷的,那么Unity對此有沒有限制呢?
實際上Unity默認(rèn)Built-in管線采用的光照渲染方式是頂點光照最多4盞,其余統(tǒng)一按照球諧處理。
以上圖燈光為例,ABCD逐像素,DEFG逐頂點,GH球諧處理。通過這樣的渲染方式處理,來保證渲染效能只是與設(shè)置的像素光數(shù)量緊密相關(guān)。
7。 一個物體同時受到像素和頂點光照如何處理?

假設(shè)在基礎(chǔ)通道里對所以物體用紅色進行渲染,逐像素的光照在額外的綠色的疊加通道進行渲染,最終我們的物體最終渲染出的結(jié)果是黃色。
在圖形學(xué)上紅色(1,0,0) + 綠色(0,1,0) =黃色(1,1,0)
總結(jié):Unity會先走基礎(chǔ)通道渲染頂點光照,再通過疊加通道渲染像素光照
8。 能否強制Unity采用像素光照或頂點光照?

假設(shè)某一盞燈光在場景里很重要,能否強制Unity將它設(shè)置為逐像素光照;或者某盞燈光在場景里無關(guān)緊要,能否強制設(shè)置為逐頂點以節(jié)省性能開銷呢?
實際上是可以的,設(shè)置燈光為Import(會采用像素光照)或Not Import(會采用頂點光照或球諧光照),可以實現(xiàn)所需要的效果。
需要注意的是:
假設(shè)只設(shè)置了一盞像素?zé)艄猓植捎昧四J(rèn)4盞像素?zé)艄獾脑O(shè)置,那么此時會有3盞燈光加入到逐像素光照,直到達(dá)到最少的像素光照數(shù)量要求。而不管設(shè)置多少Not Important燈光,Unity最多只會選擇4盞最亮的或者Unity自己決定的4盞燈光進行頂點光照處理,剩下的燈光都走球諧函數(shù)處理。這就是Unity為了防止濫用像素或頂點光照而做的數(shù)量限制。
Unity官方使用的判斷規(guī)則

渲染路徑的設(shè)置

project setting - graphics - rendering path 設(shè)置 forward 前向渲染(取消勾選use default)
主角模型可以在camera - rendering 單獨設(shè)置、
課程宣傳與VIP服務(wù)

Unity小白的游戲夢:面向零基礎(chǔ)、想要入行游戲的同學(xué)
Unity主程進階之路:面向有開發(fā)基礎(chǔ)、工作幾年尋求突破的開發(fā)者
Unity小白的TA之路:面向想要成長為技術(shù)美術(shù)的開發(fā)者
Cocos小白的游戲夢:面向想要開發(fā)微信、抖音等平臺小游戲,賺第一桶金的同學(xué)

專屬定制學(xué)習(xí)計劃
講師一對一指導(dǎo)解決學(xué)習(xí)與開發(fā)過程中遇到的問題
思路、架構(gòu)、性能優(yōu)化、源碼管理。。。等方面指導(dǎo)
每周直播工坊項目實戰(zhàn)
單一方向課程2年一對一服務(wù),大師課程4年一對一服務(wù)
VIP同學(xué)圈與企業(yè)內(nèi)推
就業(yè)與創(chuàng)業(yè)指導(dǎo)