ETH官方钱包

創作內容

9 GP

從<上古卷軸5>看幾個半透明渲染問題

作者:巧克力喬斯達│2022-01-09 22:57:02│巴幣:26│人氣:266
順便推坑有玩Skyrim的人Beyond Reach這個劇情MOD
氣氛偏向黑暗、鬱展開,苦樂參半的結局已經算最好的了,但十分傑出
早期版本一堆BUG,現在版本除了一些語音對白不完善之外,可玩性已經提高很多了
然後,回歸正題

§遊戲裡的半透明物件是?
很直觀的,就是一些半透明物件像是水面、煙霧、火花等等
而半透明物件的渲染原理其實是Blending,假設你的煙霧透明度設定成30%
那輸出結果就會是: (煙霧計算結果) * 0.7 + (背景顏色) * 0.3
背景顏色就是目前Render Target(畫布)的狀態
遊戲引擎通常會先完成不透明物件的渲染,再畫半透明物件

除了Blending以外另有Additive(加色法)、Subtract(減色法)等等不同種混色方式
遊戲引擎亦會把半透明物件以back-to-front的順序渲染,確保半透明結果正確Blending

那麼接下來就看看幾個半透明物件問題

§問題一 - 水柱的水花和水面有切邊?

盜賊公會任務結尾的場景

這個水花particle,很顯然是畫成Quad Mesh,然後始終面向鏡頭(Billboard)
而水面是一個plane,mesh跟mesh交錯就少不了切邊問題
透過Soft Particle這個小技術可以讓particle跟場景物件做柔邊

在Skyrim,如果霧氣水花打在陸地上確實也是有柔邊效果
怎麼到了半透明水面上就失效了?

這與Soft Particle的實作原理有關,當渲染soft particle時,會把場景深度值拿來跟粒子當前的深度做比對,越接近被場景(例如上圖的平面)蓋掉的時候,就會用算式去把效果淡出掉,這樣就能達成soft particle了

但我們都知道半透明物件為了確保正確疊加,從後面畫到前面
沒有輸出深度,缺乏了這個資訊當然就沒辦法做soft particle了

解法: 修改Rendering Pipeline,支援Transparent Depth
輸出半透明物件的深度在AAA遊戲也已經見怪不怪了
流程大致上是:
  • Opaque Depth Pass - Stored in Depth Buffer A
  • Copy Depth Buffer A to B
  • Transparent Depth Pass - Stored in Depth Buffer B
  • Opaque Base Pass, depth test with Depth Buffer A
  • Transparent Base Pass, depth test with Depth Buffer A, but use Buffer B as input for soft effects
這樣就能在不影響其他渲染結果的情況下,一樣持有半透明物件的深度資訊,來解決這個問題

而半透明的深度輸出,其實是沒有適當的方法讓深度值也"半透明"的
水面如果是一個plane,那就是直接輸出這個plane的深度值
不太可能根據透明度來調整深度值,因為深度值代表的就是該物件的實際深度,怎麼調整都怪

所以比較前面的半透明物件深度值會蓋掉後面的,但也足夠解決這個問題了
如果真的遇到那種需要簍空的半透明物件,以alpha test的方式輸出深度就好

§問題二 - 水面上看得到水柱,水面下看不到?

一樣是盜賊公會任務的結尾場景,這邊同時有一條水柱跟逐漸上升的水面在渲染
水面上還看得到水柱,水面下卻沒有,why?

這跟水面折射的做法有關,為了讓水面有折射的效果,shader裡會去使用背景色來做扭曲
(sorry靜態截圖,所以折射效果不明顯,但遊戲中很明顯)
而這個背景色,通常會截一張Opaque物件渲染後的結果來使用
那就很理所當然的看不到水柱了,因為你只有Opaque物件的內容

解法一: 每畫完一個半透明物件就截一次背景圖 (Bad)
瘋了,雖然能保證正確的結果,但效能直接掛掉,一次copy operation再快也要半毫秒 (1080p)
解析度越高會更久

解法二: 用腳本控制,玩家在水面下時把水柱渲染作法切換成cutoff (Not that bad)
Cutoff物件是一種在渲染過程會捨棄掉一些pixel的物件
也就是Alpha Test物件,以下圖的草貼圖為例,實際使用時會把綠背景都切除
Cutoff物件的邊緣不會跟半透明物件一樣銳利,但它也歸類在Opaque pass
所以不會導致水柱被蓋掉,缺點是要多一組材質、多了一次狀態切換

解法三: 給水面一些透明度,讓它能透出水柱
只是我的猜測,畢竟看不到底層實作,但依照back-to-front規則,水柱應該比水面還要早渲染
而我推測這個水面的透明度是0%,也就是完全使用水面本身計算結果來輸出
稍微提高一點透明度,理論上它就能透到水柱

§問題三 - SSR反射出異樣的光芒?

Reddit也有別的玩家遇過,跟模組沒關係,它在原版遊戲就這樣了
這個SSR並不是什麼課金糞手遊的SSR,而是Screen Space Reflection
後製特效的一種,顧名思義就是利用螢幕上的資訊來做反射,效能比起傳統的Image Based方法好很多,小缺點是無法反射螢幕內容外的東西,我如果故意把視線往下移動,那山的倒影就會漸漸消失,但這個方法還是瑕不掩瑜,至今廣泛應用在各遊戲上

解法: 好好檢查shader有沒有正常輸出
SSR需要Color、Normal、Specular三種GBuffer資訊
偏綠偏黃的顏色給我的感覺是錯把Normal output當成Color output了
下圖為一張Normal output範例

也許檢查一下GBuffer的輸出就能解決這個問題了

==================================================================

大致上寫寫幾個看到的問題,實在是太愛上古卷軸了
看來遊玩時數破千小時也快了
引用網址:http://www.jamesdambrosio.com/TrackBack.php?sn=5361036
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 1 篇留言

真吾
從這篇學到不少東西,感恩
我以前也很喜歡上古4,花在做Mod的時間比玩遊戲本體還多

01-10 15:07

我要留言提醒:您尚未登入,請先登入再留言

9喜歡★ltes50414 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:2021的回顧以及202... 後一篇:轉眼間,面試R星已經是一...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情? 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】