原神角色渲染01
三渲二相關(guān)
首先看了這個(gè)大佬的視頻https://www.bilibili.com/video/BV1Je4y1K74i,對(duì)三渲二學(xué)習(xí)更多一些。我現(xiàn)在構(gòu)思的角色部分最終作品,就是在一個(gè)很動(dòng)漫風(fēng)的場景里面放一個(gè)卡通渲染的人物。而且不是原神那種風(fēng)格的卡通渲染,是更偏向日本動(dòng)漫那種風(fēng)格的,比如這個(gè)大佬的視頻https://www.bilibili.com/video/BV1Fe4y1D7Pb/。
三渲二相比二維優(yōu)勢:細(xì)節(jié)可以更豐富,對(duì)于二維動(dòng)畫來說,更復(fù)雜的細(xì)節(jié)(比如各種衣服裝飾,明暗陰影)對(duì)畫師來說工作量是十分龐大的。例如寶石之國的頭發(fā),如果靠手繪在動(dòng)畫中體現(xiàn)這種效果,很難,但是用三渲二技術(shù),只需要做出模型和材質(zhì)。劣勢:二維動(dòng)畫一些效果,比如一些夸張的形變(還是可以看上面那個(gè)muro大佬的視頻)實(shí)現(xiàn)起來很難。

三渲二相比三維優(yōu)勢:其實(shí)那個(gè)大佬說得有點(diǎn)抽象,我感覺這就是風(fēng)格上的一種選擇的差距。三渲二屬于NPR下的一個(gè)分支,你選擇了這個(gè)風(fēng)格,那這就是它的優(yōu)勢。非要說的話反而劣勢還更多,三渲二流程會(huì)比純?nèi)S復(fù)雜很多。
我想到原神的三渲二,它渲的是誰的二呢,就是米哈游自己畫風(fēng)的二,可以看原神里面角色邀約的照片那種畫風(fēng)。不過好像也不對(duì),說不定是畫風(fēng)根據(jù)游戲來畫而不是游戲根據(jù)畫風(fēng)來渲染。但總之原神現(xiàn)在已經(jīng)有一套自己的渲染風(fēng)格而且哪怕和星穹鐵道和絕區(qū)零都不一樣。
視頻后面大佬從模型,動(dòng)畫,合成等等方面介紹了一些工業(yè)流程上三渲二會(huì)遇到的問題和解決方案,不過我就不做筆記了,要是以后碰到再回來看吧。
信息了解:效果很好的三渲二工具:https://www.bilibili.com/video/BV1AA411A7RR
價(jià)值數(shù)萬元的三渲二技術(shù),這應(yīng)該算是行業(yè)頂級(jí)了吧:https://www.bilibili.com/video/BV1mm4y1w78s
SDF面部陰影
看了半天終于悟了。先拋開這個(gè)SDF,看一下這個(gè)陰影貼圖。他其實(shí)是一個(gè)閾值圖。用來判斷面部哪些區(qū)域?yàn)殛幱芭c非陰影。求出當(dāng)前面部方向與光方向的夾角,比如36度,映射為0.2,那么用了這個(gè)貼圖的臉上,貼圖值小于0.2的地方就是陰影,大于0.2的地方就是非陰影。具體可以看這個(gè):https://blog.csdn.net/qjh5606/article/details/119958786。說得非常清楚。

所以在應(yīng)用階段其實(shí)和SDF沒什么關(guān)系,但是為什么叫基于SDF的面部陰影呢?(這里插一句,我發(fā)現(xiàn)我寫筆記確實(shí)很容易寫成科普文章一樣的感覺,不過就這樣吧,因?yàn)槲铱偸桥乱院蟮奈铱床欢?,所以還是越詳細(xì)越好)首先SDF是什么?Signed Distance Field有向距離場,有2D和3D,但概念都是共通的。說到場,一開始我還覺得很抽象,但是你回憶一下電場,磁場,可能就對(duì)場這個(gè)詞有點(diǎn)理解了。
首先,SDF是用來反映一個(gè)物體的。它的定義,其實(shí)就是把空間中每一點(diǎn),給它一個(gè)值,這個(gè)值等于該點(diǎn)到該物體的最短距離。在物體外的點(diǎn)是正值,在物體內(nèi)的點(diǎn)是負(fù)值。那么,這個(gè)SDF圖應(yīng)該很好理解了,有一圈剛好到純黑的地方即值為0的地方就是物體表面,外面擴(kuò)散這些就是該點(diǎn)到物體表面的距離。

那么它有什么用呢?和上面那個(gè)陰影圖有什么關(guān)系呢?可以觀看Games202的P5(不給鏈接了)它其實(shí)就是可以給出移動(dòng)的陰影貼圖之間的插值。比如下面,A陰影到B陰影是一個(gè)移動(dòng)的過程,我們想求A到B的一個(gè)中間時(shí)刻的陰影狀態(tài),怎么求?如果直接加起來平均,就得不到正確的結(jié)果,但是如果使用他們的SDF來加起來平均,就可以得到正確的插值。真是太妙了。

而SDF在這個(gè)貼圖里的應(yīng)用,就是用來生成上面那個(gè)圖的。通過事先繪制不同過程的陰影圖,然后用它們的SDF來融合成那一張圖。這個(gè)方法確實(shí)妙啊。

貼圖的原理理解了,那么就是使用了。
首先吐槽一下,之前我采樣貼圖不知道為什么這里一直報(bào)錯(cuò),結(jié)果今天再打開,突然就沒問題了。。。。明明啥也沒改。

然后明明可以這樣采樣貼圖,但是不懂為什么剛剛又一直報(bào)錯(cuò)。好無語。

總而言之,我們先對(duì)兩種貼圖采樣,然后準(zhǔn)備好后面要用的向量。面部朝向其實(shí)應(yīng)該實(shí)時(shí)取讀模型面部朝向,但是這個(gè)好像要通過腳本傳遞,所以現(xiàn)在我先直接設(shè)置為默認(rèn)的z軸方向。陰影顏色我先暫時(shí)是直接把基礎(chǔ)色變暗,后面再改。

首先我試了半天,發(fā)現(xiàn)網(wǎng)上其他大佬的代碼都不太符合直覺,而且我也已經(jīng)理解原理了,所以我按我自己的想法來搞吧。首先解釋一下step函數(shù)。我看有大佬是吧lightmap放在a的位置,但是我感覺有點(diǎn)反直覺。

如果把lightmap放在a的位置,是以lightmap為閾值劃分a,當(dāng)然這確實(shí)就是最開始說的想法,但是這樣劃分出來的結(jié)果,黑色部分是光照區(qū)域,白色部分是陰影區(qū)域,有點(diǎn)怪,所以我反了過來。

然后我要解釋一下,光方向向量其實(shí)不是從光源指出來而是指向光源的向量。lightmap圖的范圍是(0,1),如果光側(cè)面90度打過來,那么光點(diǎn)積正面朝向,結(jié)果是0。然后以0為step的lightmap圖是下面那樣的,很顯然不是我們要的。

我去,我之前就在糾結(jié)這個(gè)lightmap圖的方向是什么情況,因?yàn)槔碚撋衔蚁氲氖侵挥姓趁娌攀峭耆幱?,然后光源從?cè)后方轉(zhuǎn)過來到側(cè)面的時(shí)候倫勃朗光開始出現(xiàn),然后一直到正面。但是按那些大佬的寫法,都是光源從側(cè)面照的時(shí)候才出現(xiàn)亮光,然后幾乎到很正面了才出現(xiàn)倫勃朗光。這還是很反直覺,我甚至去搜了倫勃朗光的出現(xiàn)角度。
最終我找到了問題所在,其實(shí)一開始我是有想到的,但沒想到會(huì)導(dǎo)致這種錯(cuò)誤。首先剛開始我們用的是三維的光方向,而我們在想要它和正面方向的點(diǎn)乘結(jié)果的時(shí)候,想要的是光方向的二維方向和正面的點(diǎn)乘。但是我們沒考慮到第三維的存在,所以即使在xz平面上光的投影已經(jīng)和正面方向重合了,但是他們的點(diǎn)積還不是1,所以結(jié)果也是錯(cuò)誤的。同時(shí)仍需要極度注意的一點(diǎn)是,投影之后如果不進(jìn)行歸一化,光向量的長度不對(duì),也會(huì)導(dǎo)致結(jié)果出問題,所以投影后要進(jìn)行歸一化。


最后,根據(jù)光照貼圖是從左側(cè)還是右側(cè)打過來,判斷光照貼圖的正反。


但是這里還有一個(gè)問題,也是我上面思考的那個(gè)角度問題。最終為了求證,我直接登錄游戲觀察??梢宰⒁獾?,即使是背光,面部也是有一點(diǎn)亮的,然后經(jīng)過測試,我得出結(jié)論,原神游戲里面的SDF映射,不是簡單的直接從側(cè)面90度開始,而是和我想的一樣,從背面180度開始。我發(fā)現(xiàn)這一點(diǎn)的時(shí)候還是很開心的,因?yàn)槲铱吹哪切┐罄械膮⒖既际菑膫?cè)面90度開始,我經(jīng)過自己的觀察和思考,得出自己的結(jié)論,而不是生搬硬套,這是一種快樂的過程。

明白了正確的表現(xiàn)后,想要實(shí)現(xiàn)其實(shí)也很簡單。光線向量從背面180度到正面180度,它與正面點(diǎn)積的值是(-1到1),想把它映射成(0到1),想到什么沒有?很熟悉的映射了吧。

其實(shí)后面還有一種陰影mask圖,不過目前我還暫時(shí)不懂怎么用,所以先不用先。調(diào)一下陰影顏色后,面部陰影部分到此告一段落。
