如何做一個卡通水面效果

本文參考自教程,加上自己的一點心得體會臀玄。

首先,根據(jù)水面和場景的深度差異劃分為淺水和深水畅蹂,淺水和深水各取兩個極值健无,然后根據(jù)深度進行插值。所謂的淺水液斜,就是水面下的物體與水面的距離較小累贤,顏色較淺;所謂的深水少漆,就是水面下的物體與水面的距離較大臼膏,顏色較深。

那么示损,如何獲得場景深度呢渗磅?Unity引擎自帶了_CameraDepthTexture,但這是基于屏幕坐標系的texture屎媳,如何在frag shader里去采樣到正確的值呢夺溢?對于頂點v而言,我們先通過UnityObjectToClipPos將其轉(zhuǎn)換到齊次坐標系烛谊,此時v.xv.y的取值范圍均為[-v.w,v.w],然后根據(jù)視口變換:
screen.x = (v.x * 0.5 + v.w * 0.5) * screen.width / v.w

screen.y = (v.y * 0.5 + v.w * 0.5) * screen.height / v.w

我們發(fā)現(xiàn)嘉汰,實際的采樣坐標即為(screen.x / screen.width, screen.y / screen.height)丹禀。Unity提供了兩個內(nèi)置函數(shù)幫助我們進行采樣:ComputeScreenPostex2DprojComputeScreenPos這個函數(shù)得到的結(jié)果為((v.x * 0.5 + v.w * 0.5), (v.y * 0.5 + v.w * 0.5), v.z, v.w)tex2Dproj函數(shù)會對傳入的采樣坐標進行透視除法再采樣双泪。

然而持搜,采樣出來的深度值是經(jīng)過透視投影變換后的深度,已經(jīng)不再是線性的焙矛,我們需要把它還原為原始的深度值再進行使用葫盼。這其實本質(zhì)上是投影變換的逆變換。Unity也提供了一個內(nèi)置函數(shù):LinearEyeDepth村斟。通過該函數(shù)得到原始深度贫导,與水面的原始深度做差,利用這個差異值就可以對顏色進行線性插值了蟆盹。有兩點需要意識到:

  1. 場景深度texture里保存的深度信息是水面渲染之前的孩灯,也就是說是不包含水面的深度信息的,另外逾滥,在開啟early-z的情況下峰档,水面frag代碼執(zhí)行的條件就是水面的深度值要比場景深度值要小
  2. 水面的原始深度值就是ComputeScreenPos這個函數(shù)返回的w。在進行透視除法之前寨昙,原始深度值一直保存在vertex的w分量

綜上讥巡,以上實現(xiàn)的shader代碼如下:

float existDepth01 = tex2Dproj(_CameraDepthTexture, i.screenPos).r;
float existDepth = LinearEyeDepth(existDepth01);
float difference = existDepth - i.screenPos.w;
float difference01 = saturate(difference / _MaxDistanceCutOff);

float4 waterColor = lerp(_ShallowWaterColor, _DeepWaterColor, difference01);

效果如圖。

如何做一個卡通水面效果1.jpg

第二步舔哪,我們需要為水面加上一些擾動信息欢顷,來實現(xiàn)波紋效果。使用一張噪聲貼圖尸红,直接采樣出顏色與現(xiàn)有顏色疊加:

如何做一個卡通水面效果2.jpg

可以發(fā)現(xiàn)吱涉,由于顏色直接疊加等舔,把大部分區(qū)域的顏色刷得太亮了女揭,而我們想要的,其實是亮的地方顏色保持不變啤呼,暗的地方刷成波紋的顏色盅蝗,因此加一個cutoff進行過濾:

如何做一個卡通水面效果3.jpg

接下來鳖链,我們希望靠近岸邊的邊緣部分也要有波紋《漳靠近岸邊的水面和場景的深度差異較小芙委,可以利用這一點降低對噪聲的cutoff值,讓邊緣部分的噪聲也可以add到水面上:

如何做一個卡通水面效果4.jpg

另外狂秦,可以再加一張擾動貼圖灌侣,采樣兩個通道對噪聲貼圖的uv進行偏移,來實現(xiàn)流動的效果裂问。

現(xiàn)在侧啼,大體的感覺已經(jīng)有了牛柒。細心觀察可以發(fā)現(xiàn),水面與物體接觸的地方痊乾,波紋應(yīng)該更明顯一點皮壁,也就是與物體接觸的地方需要額外降低對噪聲的cutoff值。這時哪审,需要借助場景中的法線數(shù)據(jù)來處理蛾魄。水面與物體接觸的地方法線差異比較大,其他地方法線差異比較小湿滓。容易想到用兩個法向量的點積來衡量向量的差異程度滴须。

由于Unity自帶的法線紋理精確有限,這里考慮自己渲染出一張場景的法線紋理圖茉稠。額外新建一個camera描馅,通過設(shè)置它的depth,使用SetReplacementShader方法而线,替換掉場景中其他所有shader铭污,讓其都用寫法線的方式渲染,得到RT膀篮。這個方法可以替換掉所有對于Tag相同的shader嘹狞,讓它們用指定的shader渲染,對于Tag不同的誓竿,則跳過渲染磅网,這里可以參照Unity官方文檔。

如何做一個卡通水面效果5.png

接下來筷屡,我們可以通過修改shader的tag和blend模式涧偷,來讓水面變得透明。同時毙死,我們還希望能夠調(diào)整波紋的顏色燎潮。為了讓波紋自身的顏色能與水面本身的顏色融合而不是相加,我們采用alpha-blend的模式扼倘,讓波紋自身的顏色blend到水面上确封,這時,之前用到的cutoff得到的結(jié)果可以用在設(shè)置波紋的alpha上再菊。

如何做一個卡通水面效果6.png

最后爪喘,對波紋邊緣處,可以用smoothstep對cutoff進行平滑纠拔。

總結(jié)一下秉剑,實現(xiàn)一個簡單的卡通水面效果,分為如下幾個步驟:

  1. 根據(jù)水面與場景的深度差異稠诲,劃分出淺水區(qū)和深水區(qū)秃症;
  2. 使用噪聲貼圖blend到水面上候址,達到水波紋的效果吕粹,注意在水面邊緣种柑,深度差異小的地方水波紋的效果大;在水面中央有物體的地方匹耕,法線差異大聚请,水波紋效果也大;
  3. 通過調(diào)整blend的模式稳其,讓水波紋可以設(shè)置自身的顏色blend到水面上驶赏;
  4. 水波紋效果邊緣可以用smoothstep進行平滑。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末既鞠,一起剝皮案震驚了整個濱河市煤傍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嘱蛋,老刑警劉巖蚯姆,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異洒敏,居然都是意外死亡龄恋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門凶伙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郭毕,“玉大人,你說我怎么就攤上這事函荣∠匝海” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵傻挂,是天一觀的道長乘碑。 經(jīng)常有香客問我,道長踊谋,這世上最難降的妖魔是什么蝉仇? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮殖蚕,結(jié)果婚禮上轿衔,老公的妹妹穿的比我還像新娘。我一直安慰自己睦疫,他們只是感情好害驹,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛤育,像睡著了一般宛官。 火紅的嫁衣襯著肌膚如雪葫松。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天底洗,我揣著相機與錄音腋么,去河邊找鬼。 笑死亥揖,一個胖子當著我的面吹牛珊擂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播费变,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摧扇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挚歧?” 一聲冷哼從身側(cè)響起扛稽,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滑负,沒想到半個月后在张,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡橙困,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年瞧掺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡傅。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辟狈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夏跷,到底是詐尸還是另有隱情哼转,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布槽华,位于F島的核電站壹蔓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏猫态。R本人自食惡果不足惜佣蓉,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亲雪。 院中可真熱鬧勇凭,春花似錦、人聲如沸义辕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灌砖。三九已至璧函,卻和暖如春傀蚌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蘸吓。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工善炫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人美澳。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓销部,卻偏偏與公主長得像,于是被迫代替她去往敵國和親制跟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容