UWA優化日廈門站回顧 | 資深TA教你如何將藝術概念轉化為渲染代碼
原文鏈接:UWA優化日廈門站回顧 | 資深TA教你如何將藝術概念轉化為渲染代碼
1月7日,UWA優化日廈門站順利落下帷幕。在4個多小時的技術分享中,張鑫和張強分別帶來了UWA最受歡迎的兩大議題— 如何「UWA」你的遊戲 和 「UI開發和優化技巧」。同時活動的特邀嘉賓—來自廈門夢加的技術美術負責人Dave為我們分享了Shader的開發流程:怎樣用Unity製作驚艷的畫面 —將藝術概念轉化為渲染代碼。
為了方便大家歸納總結,溫故知新,我們及時整理了活動內容,並附上Dave演講稿(摘選),大家可以點擊相關議題,即可下載完整PPT。
- 張鑫:如何「UWA」你的Unity手游
- 張強:UGUI性能優化技巧
- Dave:怎樣用Unity製作驚艷的畫面,將藝術概念轉化為渲染代碼
Dave:
大家好,今天我來為大家介紹下Shader方面的優化和開發技巧。當我做到這個PPT的一半時,發現我是從美術的角度寫這個東西。我有三年的程序經驗,在這之前都是美術。考慮到有的TA是美術轉技術,有的是技術轉美術,所以對Shader優化的標準不同。我之前是在做完效果後再去優化,但經過多年的行業經驗發現,如果能在開始就優化,能為開發省時不少。在開始演講之前,我先給大家一條建議:如果是做非常牛逼的渲染,我的建議是你要考量下這個成本,因為這個很有可能拖長你的開發周期。
一、一般流程
◆ 視覺想法
開始做效果的時候,你得有個想法。泡沫、火花、特別是那種波紋很長的、很細的、有變幻的特效,你一定得想清楚要什麼類型的材質。就比方說如果是水,也有各種各樣的水、海水、污水、流水......每種細分的效果可能完全不同,所以一種代碼是不能共用給其他效果的,比如流水要一種,海水要另一種。如果你要實現更多種效果,就要使用更多材質。
◆ 主要效果
確定好你的材質是什麼之後,你就可以列上這個材質類型最主要的效果。如果是水,那應該是從一個透明的面片開始,半透明是個最默認的效果。然後有波瀾,大海或者水邊的泡沫、小高光、地平太陽線的高光等。這就是你要列下的效果,並用不同的技術來實現。每一種效果的技術未必是標準唯一的,所以你們需要思量哪種是最貼合項目的需求。
◆ 收集資源
收集資源的時候也需要考慮下技術是否能支持。我們經常使用模型、貼圖和材質這三種類型的資源。你需要從選擇技術人員需要的資源開始製作,一個個把效果加進去測試。
◆ 關於測試
每個公司有自己的測試流程, 所以測試Shader性能的方式也不一樣。我會在編譯的時候,測試這個Shader的Vert/Frag的Math數量。最難控制的地方大部分在背景,特別是地形、水和植被等。一般情況下,角色在Shader的消耗上沒有像背景消耗那麼多,所以並不需要那麼嚴格的控制,但是背景一定要控制。在我們使用的工具中,Unity的Profiler可以用,但是對我來說沒有那麼大的幫助,它可以測試內存,但對渲染的性能監控我們建議還是用別的工具。最好的方式就是發布一個版本,然後再真機上測試。
二、渲染優化的幾個技巧
下面我們再講幾個實用的技巧:
貼圖的顏色通道可以存放很多不同的數據。有的顏色可以保存在頂點的數據中。有時候,你要用的渲染顏色數據太多,所以可以用一個模型的UV對應一套貼圖的數據。
◆ 我們的項目將三種類型的數據保存到一個特殊的紋理中來渲染遊戲中的角色和武器。
紅色通道:保證它的高光亮度;
綠色通道:用來渲染反射效果;
藍色通道:用來保存AO信息;
阿爾法通道:我們不用,因為貼圖的內存消耗過高。
◆ 高光渲染技巧
我想要在每個像素中渲染Specular和Rimlight效果,但是它在Android機器上的點積計算非常耗性能,所以我們只用了一次點積計算來近似處理這兩種效果,雖然這在數學上是不正確的,但是大部分玩家從畫面上看不出這樣的差別,而且也節省了不少性能。
◆ 實時光渲染技巧
大家在渲染實時光的時候也許會發現,人物模型的臉上發黑,但是沒有更多的紋理來掩蓋這部分區域。在這裡我們先看下法線貼圖,然後用著色器代碼(主要是大量的白色)來模仿法線貼圖的藍色通道。在法線貼圖藍色通道(空閑著)里保存皮膚遮罩。
◆ 關於頂點色的優化
我們希望遊戲中的草比其他遊戲更密集、更具交互性,但草地的數量在光照貼圖中佔據了太多空間。這導致了許多遊戲對象的光照貼圖太模糊。所以我們決定將光照貼圖的顏色保存到草叢網格的頂點顏色中,這樣它們就不需要進行Unity的光照烘焙。這也使得它們能更高效地渲染,因為不再需要讀取額外的Lightmap信息。
◆ 光照貼圖拆分
Lightmap的處理比較多。我們的烘焙圖一開始用Unity的,但是法線要做一些實時變化,所以我們就將三個顏色通道分開保存。這樣我們能夠給每個關卡配置許多不同的配色方案,給它們不同的感覺和照明,玩家在闖關的時候就不會感到重複。同時,雖然照明的方案在改變,關卡的資源包大小卻不會有增加。
現在我們再回顧下整個過程。從初級的「頂點動畫」到高級的「細分曲面」,只要我們慢慢、逐步學習,終能製作出驚艷的視覺效果。
推薦閱讀:
※你應該知道的AssetBundle管理機制
※千億特徵流式學習在大規模推薦排序場景的應用
※Unity3D回合制手游《星辰奇緣》性能測評深度分析
※Unity匿名函數的堆內存優化
※一個採用GC的原生程序語言有沒有可能性能上超越非GC的原生程序語言?