Unity3D 正確地把RT渲染到UI上

2021-08-19 15:13:04 字數 1451 閱讀 2784

假設在rt上去渲染乙個pixel,rt的背景顏色是b,按順序去寫顏色,先寫a1, 再寫a2,那麼最終的到的顏色

art = (a1 blend (a2 blend b))

展開 :

a2 blend b = a2 * f2 + b * f2'

a1 blend (a2 blend b) = a1 * f1 + (a2 * f2 + b * f2') * f1'

得到 :

art = a1 * f1 + (a2 * f2 + b * f2') * f1' = a1 * f1 + a2 * f2 * f1' + b * f2' * f1'

令c = a1 * f1 + a2 * f2 * f1' 

t = f2' * f1'

得到 art= c + t * b

問題來了,如果你拿一張rt渲染到 rawimage 上,按照以上的公式來推導,得到:

bi = ui 的背景顏色

a = art blend bt = art * frt + bt * frt' =  (c + t * b) * frt + bt * frt' 

但是實際上,我們真正需要的只是想把rt上的黑色背景替換為ui的背景,再覆蓋到ui上而已,也就是

a = c + t * bi

那我們要實現a = c + t * bi,要怎麼做。

這裡的做法就是,把c, t 都存到rt上,當rt賦予image的時候,再從rt上取回c,t,就可以順利地計算 a = c + t * bi。

那怎麼才可以儲存c和t呢?

對於c的儲存,看上面的,渲染場景到rt上的情況:

c =  a1 * f1 + a2 * f2 * f1'  = a1 blend ( a2 * f2 ) = a1 blend ( a2 * f2 + b * f2')  (當b = zero 的時候成立) = 

a1 blend ( a2 blend b) (當b = zero 的時候成立)

所以,其實正常渲染場景的東西到rt上,rt的背景顏色rgb是黑色的話,rt的rgb 儲存的就是c了。

對於t的儲存,

t =  f2' * f1'  

可以利用rt的alpha來儲存,blend op 沒有乘法操作,那麼可以 使用 scralpha * zero + dstalpha * dstblendfactor

並且 rt上的背景顏色的alpha要是1.

最後給出實現:

假設乙個particle system 要渲染到 rt上,那麼 particle system使用的shader 應該要這樣:

blendop add, add

blend srcalpha oneminussrcalpha, zero oneminussrcalpha

colormask rgba

那麼 rt 給到乙個rawimage上,rawimage的材質用的shader 應該要這樣 :

blend one srcalpha

unity3d渲染路徑Rendering Path

unity3d使用不同的渲染路徑。你可以根據遊戲內容和硬體選擇合適的渲染路徑。不同的渲染路徑有不同的特性。主要會影響遊戲的光照和陰影。渲染路徑在playersetting中可以設定,也可以在camera中覆蓋進行設定。1,deferred lighting deferred lighting會準確如...

unity3d使用octane gpu渲染場景體驗

測試了一下u3d下的octane渲染器 目前是免費的,可以隨意測試 之前提到過了 現在趕緊過來試試 我測試電腦是win7 gtx1080 記得提前把顯示卡驅動之類打好 注意目前一定要2017.1的版本,不過現在free裡面能下到的就是這個,直接下就行了 教程可以參考官網 按照步驟安裝好後,開啟渲染視...

Unity3D的渲染排序思路

主要的思路就是 場景中有各種各樣的物體要渲染,那麼渲染排序的意思就是,哪一些物體是先渲染,哪一些跟著渲染,哪一些最後渲染,等等。1.在材質上宣告這個物體是什麼時候渲染的。例如 enum renderqueue 2.所有的物體的材質都宣告了renderqueue 的tag,那麼,就可以開始收集每乙個物...