使用Covermap實現地形細節
一、Covermap的實現
1、對Covermap的理解
常見的地形制作都是使用Heightmap+Splatmap來實現地形和紋理層混合的效果。
2、Covermap的Shader實現
由於草的本身不受其他光照影響,它的著色基本上就是一個diffusecolor,所以,以草的Shader為例來介紹一下Covermap的Shader實現。
-
Covermap的引數
我們需要宣告兩個引數,一個引數 _Covermap用於紋理的取樣,預設顏色為“gray”灰色。將預設顏色定義為灰色,是因為可以在灰色的基礎上進行疊亮或減暗。
另一個引數 _CoverMappingRect是為了設定Covermap的對映範圍,方便在世界座標中做對齊。預設為(0,0,512,512),如果我們建立的地形大小為512,座標在[0,0,0],那麼Covermap的紋理會準確的對映在地形上。如果地形有偏移,我們需要將偏移的值設定給_CoverMappingRect引數。
在返回顏色值時,只需要簡單的乘上Covermap紋理的顏色,也就是 *_Covermap_var.rgb*2。這裡的乘2是為了將灰色轉為1,預設的Covermap顏色為灰,即*_Covermap_var.rgb*2 = 1,不會對最終效果有任何影響。如果Covermap紋理貼圖上的顏色值>0.5,那麼最後顯示的顏色會變亮,<0.5,最後顯示的顏色會變暗。建議Covermap在Gamma空間下製作,線上性空間使用時勾選sRGB。
-
Covermap的開銷
從上面的實現來看,Covermap在Shader裡的運算很簡單,它的開銷就在於對Covermap紋理貼圖的取樣,和兩次乘法運算。Covermap紋理貼圖的精度不超過1024的情況下,一般不會有太大的效能影響。
二、Covermap的美術製作流程
Covermap的原理和技術實現都很簡單,我們將它應用於遊戲的效果表現中,最重要的還是美術流程上的製作過程。
我們把Covermap的製作流程劃為地形制作流程的一部分,在WorldMachine的地形制作流程中增加光照方位、水紋等輸出紋理,然後在Photoshop中透過圖層合併。
-
在Covermap上新增陰影細節
一般的製作思路都是地形直接參與光照烘焙,但是當地形尺寸達到1024的級別時,一般會出現兩個問題,一個是烘焙耗時,一個是對地形做切分最佳化後烘焙會有接縫。我們想用Covermap來取代地形的光照烘焙,所以在專案的某個階段我們在3dsMax中烘焙一張陰影圖。還有前文說到的草是不受任何光照的,所以草地也需要其他物件的陰影細節。
我們將場景物件和地形一起匯出,在3dsMax中模擬一盞場景同角度的燈光,然後新增一個攝像機進行對位,渲染出一張陰影圖。將陰影圖疊加到Covermap的最後一層。
如果要使用實時陰影,就需要儲存兩張Covermap進行切換,一張是不帶max投影的。而對於草地,使用帶max投影的Covermap即可。
下圖可以看到最後應用在地形上的效果:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70019421/viewspace-2906019/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解virtual dom的實現細節-snabbdom
- OpenFeign 使用細節
- 原始碼閱讀之LinkedList實現細節原始碼
- 原始碼閱讀之ArrayList實現細節原始碼
- 迴圈佇列的實現及細節佇列
- Laravel核心解讀–使用者認證系統的實現細節Laravel
- Promise 規範解讀及實現細節 (二)Promise
- COP4600 檔案系統實現細節
- 【freertos】006-任務切換實現細節
- Redis高可用之哨兵機制實現細節Redis
- Dubbo2.7的Dubbo SPI實現原理細節
- Spring(4)-AOP使用細節Spring
- GO 變數使用細節Go變數
- HDFS 原始碼解讀:HadoopRPC 實現細節的探究原始碼HadoopRPC
- Spartacus 註冊和登入頁面的實現細節
- 【freertos】012-事件標誌概念和實現細節事件
- Laravel核心程式碼學習–使用者認證系統的實現細節Laravel
- Laravel核心程式碼學習--使用者認證系統的實現細節Laravel
- 【freertos】007-系統節拍和系統延時管理實現細節
- [JAVA] Java switch的使用細節Java
- 探索 YOLO v3 實現細節 - 第5篇 LossYOLO
- 探索 YOLO v3 實現細節 - 第2篇 模型YOLO模型
- 深入探究JVM之垃圾回收演算法實現細節JVM演算法
- Dapr實現分散式有狀態服務的細節分散式
- 探索 YOLO v3 實現細節 – 第2篇 模型YOLO模型
- 細節解析 JavaScript 中 bind 函式的模擬實現JavaScript函式
- 探索 YOLO v3 實現細節 - 第3篇 網路YOLO
- Rhinoceros 8:實現細節完美的三維建模 mac/win版ROSMac
- C++17 std::variant 詳解:概念、用法和實現細節C++
- 【freertos】010-訊息佇列概念及其實現細節佇列
- 【freertos】004-任務建立與刪除及其實現細節
- 再探go modules:使用與細節Go
- Docker 19.03.13的四個使用細節Docker
- vue元件使用的細節 is 屬性Vue元件
- Termux使用的一些細節UX
- 使用CSS實現《聲生不息》節目LogoCSSGo
- JVM(四)垃圾回收的實現演算法和執行細節JVM演算法
- LayIM.AspNetCore Middleware 開發日記(五)Init介面實現細節NetCore