1. 程式人生 > >轉載】Unity3D美術方面貼圖蓄力帖(值得珍藏學習)

轉載】Unity3D美術方面貼圖蓄力帖(值得珍藏學習)

LIGHTMAP

什麼是烘焙? 簡單地說, 就是把物體光照的明暗資訊儲存到紋理上, 實時繪製時不再進行光照計算, 而是採用預先生成的光照紋理(lightmap)來表示明暗效果. 那麼, 這樣有什麼意義呢?

好處:

由於省去了光照計算, 可以提高繪製速度 
對於一些過度複雜的光照(如光線追蹤, 輻射度, AO等演算法), 實時計算不太現實. 如果預先計算好儲存到紋理上, 這樣無疑可以大大提高模型的光影效果 
儲存下來的lightmap還可以進行二次處理, 如做一下模糊, 讓陰影邊緣更加柔和 
當然, 缺點也是有的:

模型額外多了一層紋理, 這樣相當於增加了資源的管理成本(非同步裝載, 版本控制, 檔案體積等). 當然, 也可以選擇把明暗資訊寫回原紋理, 但這樣限制比較多, 如紋理座標範圍, 物體例項個數... 
模型需要隔外一層可以展開到一張紋理平面的UV(範圍只能是[0,1], 不能重合). 如果原模型本身就是這樣, 可以結省掉. 但對於大多數模型來說, 可能會採用WRAP/MIRROR定址, 這隻能再做一層, 再說不能強制每個模型只用一張紋理吧? 所以, lightmap的UV需要美術多做一層, 程式展開演算法這裡不提及.... 
靜態的光影效果與對動態的光影沒法很好的結合. 如果光照方向改變了的話, 靜態光影效果是無法進行變換的. 而且對於靜態的陰影, 沒法直接影響到動態的模型. 這一點, 反而影響了真實度 
肯定不只這幾點,但我暫時只想到這幾點

那麼怎麼生成lightmap呢?

最直接的辦法: 光線追蹤....(原理想想很簡單, 按照物體定律來就可以了)

但是光線追蹤這東西......就算用來離線生成我都嫌慢-_-

下面說的這個是利用GPU進行計算的, 跟實時光照沒什麼兩樣:

原理:

想想實時渲染的頂點變換流程: pos * WVP之後, 頂點座標就變換到螢幕空間了[-1, 1]

如果VertexShader裡直接把紋理座標做為變換結果輸出(注意從[0,1]變換到[-1,1]), 那麼相當於直接變換到了紋理座標系, 這時在PixelShader裡還是像原來那樣計算光照, 輸出的結果就可以拿來做lightmap了

靜態模型的Lightmap(光照貼圖)與Vertex-Lighting(頂點光照)之比較

通常有個誤解就是,Vertex-Lighting是一種不費的靜態模型打光手段,因此應該被作為提升地圖執行效率和減少檔案尺寸的手段。這種觀點,在這兩方面其實都有問題Lightmap使用平展開的一套UV,如同普通面板貼圖所需的。Lightmap的貼圖大小可以靈活設定,比如64x64。這種方式提供了每畫素的光照資料Vertex-Lighting使用的資料結構,包含每個頂點所受光照的亮度和色彩資訊。


該資料結構消耗特定量的記憶體,這個量是由模型的頂點數量決定的,不能隨意改變在多數情況下,靜態模型應該設成使用Lightmap,因為這可以產生最好的視覺效果,最好的執行效率,而且比Vertex-Lighting消耗更少的記憶體Lightmap和Vertex-Lighting相比較,具有如下優點:- Lightmap可以減少CPU和GPU的佔用- Lightmap讓CPU需要計算的光照和物體間的互動更少- Lightmap不需要在GPU的多重pass中被渲染- Lightmap pass被整合進Emissive(自發光)pass中,因此可以縮短渲染時間- Lightmap可以表現交錯覆蓋於靜態模型三角面上的複雜的每畫素光照,然而Vertex-Lighting只能表現頂點到頂點之間線形的漸變- 使用Lightmap的靜態模型,可以通過優化使用更少的三角形,獲得額外的效率提升。

為使用Vertex-Lighting而製作的模型,通常需要較高的細分度,獲得更多的頂點來改善頂點之間的光照過渡,然而這種做法的副作用是提升了模型的三角形數量並影響執行效率- 靜態模型上的Lightmap可以設定為使用很小的解析度,比如16x16或32x32,來減少記憶體開支。這對於遠離遊戲中心區域的靜態模型來說,非常有用,這同樣也適合受光很均勻的模型。
Vertex-Lighting就不具有這種優化的便利,它總是消耗同樣數量的記憶體來存放模型全部頂點的資料結構- Lightmap可以通過調整UV的佈局,來進行優化以提供儘可能好的光照質量。比如,有一個球形岩石,可以將它的底部的三角形的UV尺寸做得很小,從而讓這部分在整個Lightmap的UV上面只佔據很小一塊,這樣,對於頂部和側面來說,就獲得了更大的貼圖面積於是有更精細的光照效果。Vertex-Lighting的精度總是對應於頂點數,而效果又受模型實際大小的影響(就是說縮小了看還可以的模型,放大比如一百倍,由於頂點不能改變,所以效果也變糙一百倍,而Lightmap因為可以靈活設定精度不存在這個問題),並且不能被優化如果靜態模型的三角形和頂點數量很少的話,那使用Vertex-Lighting可能會比使用Lightmap佔用更少的記憶體,然而,使用Lightmap絕對是看起來更好的,效率也更高的。


使用Lightmap讓LD可以優化光照的質量和記憶體的佔用所以Lightmap顯然是比Vertex-Lighting更好的選擇舉個例子:比如使用UT3這遊戲的靜態模型HU_Deco_Pipes.SM.Mesh.S_HU_Deco_Pipes_SM_Pipe01該模型有2555個三角形和2393個頂點如果在場景中放置此模型的420個例項,並且都使用Vertex-Lighting,那麼總共消耗11MB記憶體如果在場景中放置此模型的420個例項,並且都使用32x32的Lightmap,那麼總共消耗850kb記憶體如果在場景中放置此模型的420個例項,並且都使用64x64的Lightmap,那麼總共消耗3.3MB記憶體佔用記憶體的量,也會在地圖檔案的尺寸上有所表現這個例子中的一部分例項,其所用的Lightmap的精度,可以設到128x128或者更高以便獲得最佳的光照效果,而仍然使用相比Vertex-Lighting來說更少的記憶體。並且使用Lightmap的版本,要比Vertex-Lighting版本在渲染上快8-10個百分點。

相關推薦

轉載Unity3D美術方面值得珍藏學習

LIGHTMAP 什麼是烘焙? 簡單地說, 就是把物體光照的明暗資訊儲存到紋理上, 實時繪製時不再進行光照計算, 而是採用預先生成的光照紋理(lightmap)來表示明暗效果. 那麼, 這樣有什麼意義呢? 好處: 由於省去了光照計算, 可以提高繪製速度  對於一些過度複雜的光照(如光線追蹤, 輻射度, AO等

[Unity3D]關於U3D格式壓縮

dia 16bit 普通 像素 壓縮 安卓 透明 power maps http://blog.sina.com.cn/s/blog_5b6cb9500102vi6i.html 因為有不少人都問過我壓縮格式的問題,今天飛哥又重新提醒了一次。整理一下發個貼,以供大家查閱和

轉載一張“神”看懂單機/集群/熱備/磁盤陣列RAID

mpp bz2 wap 轉載 另一個 clu 提供服務 dsd otto 單機部署(stand-alone):只有一個飲水機提供服務,服務只部署一份 集群部署(cluster):有多個飲水機同時提供服務,服務冗余部署,每個冗余的服務都對外提供服務,一個服務掛掉時依然可

【PBRsubstance painter中至vray for max渲染

【PBR】substance painter中貼圖至vray for max渲染 找到一個小小的免費工具,Clovis Gay的一個新指令碼,用於幫助將Substance Painter建立的材質貼圖匯入3DS Max,並使用V-Ray材質正確渲染。 官方下載地址:https:/

【個人Unity筆記烘焙光照後保留法線和光探頭

使用的5.34f1版本的unity 有時候為了節省開銷,烘焙光照貼圖是一種很好的辦法,在手機上開發經常會使用到,配合光探頭還可以讓靜態光和非靜態物體產生互動。 首先,把要烘焙的物體全部勾選為靜態(Static)。 然後,把需要烘焙的光的Baking由預

three.js 多面幾何體進行多面 (後需要再次渲染才能顯現出來

let materials = []; for (var i = 0; i < 6; ++i) { materials.push(new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('../

轉載 如何輕鬆愉快地理解條件隨機場CRF

理解條件隨機場最好的辦法就是用一個現實的例子來說明它。但是目前中文的條件隨機場文章鮮有這樣乾的,可能寫文章的人都是大牛,不屑於舉例子吧。於是乎,我翻譯了這篇文章。希望對其他夥伴有所幫助。 原文在這裡http://blog.echen.me/2012/01/03/introduction-to

轉載CentOS7下用yum快速搭建LAMP平臺應用於安裝zabbix

實驗環境: [[email protected]7 html]# cat /etc/redhat-release CentOS release 7.3.1611 (AltArch) [[email protected]-7 html]# uname -a Linux

CityEngine基於規則的實現技巧

通過內部規則控制實現紋理貼圖,主要是指採用texture的方式進行貼圖。在使用texture進行貼圖的過程中其最關鍵的在於約束texture引入的圖片所代表的實際大小和其擺放的位置等資訊,因而就產生了控制圖片代表實際尺寸、圖片重複的次數兩種方式的貼圖。下面就針對這兩種方式進行簡單的介紹。 控制圖片代表的實際尺

Android OpenGLES2.0十六——3D模型及光照處理obj+mtl

在Android OpenGLES2.0(十四)——Obj格式3D模型載入中實現了Obj格式的3D模型的載入,載入的是一個沒有貼圖,沒有光照處理的帽子,為了呈現出立體效果,“手動”加了光照,擁有貼圖的紋理及光照又該怎麼載入呢? 模型檔案 本篇部落格例子中

轉載 雨鬆MOMO 2014年07月16日 於 雨鬆MOMO程式研究院 發表 Unity3D研究院之Time.timeScale、遊戲暫停七十四

專案裡面一直在用Time.timeScale來做遊戲的 1倍 2倍整體加速,今天我仔細看了一下Time.timeScale才發現之前我理解錯了一些東西。 Time.timeScale可以控制Update 和LateUpdate 的執行速度,舉個例子說明一下。

【功能點前端vue傳過來的是base64格式解碼變成二進位制的圖片怎麼做多上傳

                此是tp5框架,控制器中的程式碼 總體思路: 1、先接收資料,遍歷到是字串為止 2、處

【poj1966Cable TV Network 無向點連通度最大流

Description The interconnection of the relays in a cable TV network is bi-directional. The network is connected if there is at lea

轉載plsql返回記錄集的方法利用table函式—之二

今天在開發的時候,要找出兩個表中的不同記錄。我一般是用exists的,但看到也可以這樣SELECT T5,T6,T7,T8 FROM TAB02 WHERE      T5||T6||T7 NOT IN      (SELECT T1||T2||T3 FROM TAB01)把幾個欄位合併成一個欄位,雖然很SB

【echarts柱狀設定固定寬度最大寬度

//柱狀圖 var barGragh = document.getElementById('barGragh'); var barChart = echarts.init(barGragh); var barChartoption

MATLAB:像的移動move函數

blog color msh set 圖像 figure img 清空 ges 圖像移動涉及到move函數,實現過程如下: close all; %關閉當前所有圖形窗口,清空工作空間變量,清除工作空間所有變量 clear all;

【省選水題集Day1一起來AK水題吧! 題目更新到A

不同的 運算 得到 只有一個 參加 .html color spa 大於 題解:http://www.cnblogs.com/ljc20020730/p/6937954.html 水題A: [AHOI2001]質數和分解 題目網址: https://www.luogu.o

【省選水題集Day1一起來AK水題吧! 題解更新到A

簡單dp log write .cn var 滾動 最優 har 復雜度 題目:http://www.cnblogs.com/ljc20020730/p/6937936.html 水題A:[AHOI2001]質數和分解 安徽省選OI原題!簡單Dp。 一看就是完全背包求方案

【51NOD-01089 最長回文子串 V2Manacher算法

lose 最長回文子串 gif () none print struct hide pac 【算法】回文樹 #include<cstdio> #include<algorithm> #include<cstring> using na

像識別練習flash驗證碼

探討 野比 2012由於破解可能給他人帶來困擾,所以我只說大概的思路,不會提供源碼。-----------------本次目標是www.iboling.com的flash驗證碼。這個網站很新穎,用的是flash動畫,隨機給出大小球,然後讓用戶用鼠標點擊相應的球,實現驗證碼輸入。像這樣本來這是個很不錯的思路,跳