順便推坑有玩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的輸出就能解決這個問題了
==================================================================
大致上寫寫幾個看到的問題,實在是太愛上古卷軸了
看來遊玩時數破千小時也快了