Unity眼球shader筆記

正面

側(cè)面

虹膜大小參數(shù)

瞳孔大小參數(shù)

折射率參數(shù)

視差程度參數(shù)

模型

眼球結構

我們可以明顯看到眼球前方有一個凸起的部位嘿棘,包含了角膜房水等結構劲腿,因此在建模時需要體現(xiàn)出這一效果。



UV映射直接采用了Y軸平面映射鸟妙。


虹膜大小調(diào)整

這里將模型自帶的UV首先轉(zhuǎn)換成關于原點中心對稱焦人,比較方便計算挥吵。然后將UV到原點長度大于設定值的返回鞏膜顏色,小于設定值的我們做虹膜的渲染垃瞧,并且使用一個新的UV(虹膜邊緣UV長度為0.5蔫劣,中心依然為原點)方便之后的計算。

float2 sUV = i.uv - float2(0.5, 0.5);
float2 sUVIris = sUV / _IrisRadius / 2;

虹膜視差效果

由于虹膜和瞳孔的部分是處于角膜下一定距離个从,并且房水和角膜作為介質(zhì)有一定的的折射率脉幢,因此這里我們需要引入一個視差效果來給予眼球立體感。

我將所有的計算首先轉(zhuǎn)換到模型空間下嗦锐。這里如果將虹膜視為一個平面嫌松,(模型采用平面投影UV,不過此處為了讓計算更簡單一點采用表面法線和虹膜平面的交點作為原UV)我們可以得到如下的光路圖:


只要求得了偏移量x以及偏移方向奕污,我們就能得到偏移后的UV萎羔,使用此UV采樣貼圖就可得到折射后產(chǎn)生的視差效果。

具體計算方式是:


在有些情況下這里的UpR可能成為一個負值碳默,不過最終我們得到的偏移量是一個標量贾陷,這個矯正需要用偏移方向向量來做。至于式子中的d嘱根,可以用一個高度紋理采樣髓废,越靠近虹膜邊緣處折射越小,我這里是在shader里直接計算了球面減去平面的高度差该抒。

float cosUpN = dot(objectNormal, float3(0,1,0));
float sinUpN = sqrt(1 - cosUpN * cosUpN);
float cosVN = dot(objectNormal,  objectViewDir);
float sinVN = sqrt(1 - cosVN * cosVN);
float sinRN = sinVN / _IOR;
float cosRN =  sqrt(1 - sinRN * sinRN);
float cosUpR = sinUpN * sinRN + cosUpN * cosRN;
float2 sUVIris = sUV / _IrisRadius / 2;
float d1 = sqrt(1 - sUVIris.x * sUVIris.x - sUVIris.y * sUVIris.y) - 0.86603;
float d2 = sqrt(0.3025 - sUVIris.x * sUVIris.x - sUVIris.y * sUVIris.y) - 0.22913;
float2 deltaUV = _Distortion * (d2 - d1) * sinRN / cosUpR * uvDirection;

一開始我直接將偏移方向設定為視線方向在虹膜平面上的投影方向向量慌洪,不過這實際上是不對的,因為實際偏移方向也是和眼球表面法線相關的凑保。



如圖所示冈爹,圖中偏移方向應該向左,然而視線在平面上的投影是向右的欧引。這個問題花費了我不少時間排除……最終我使用的計算方式是:

float3 T = cross(objectViewDir,objectNormal);
float3 D = cross(float3(0,1,0),T);
float2 uvDirection = float2(D.x,D.z);

這里采用了叉乘的方式矯正了VN空間關系導致的UV偏移方向反轉(zhuǎn)频伤。

使用得到的偏移量乘以偏移方向作為UVOffset,就能夠產(chǎn)生比較令人信服的折射效果芝此。

最后我們會得到一些虹膜紋理并不存在的UV(UV長度大于0.5)憋肖,于是我們還要引入一張虹膜的遮罩mask讓這些片段去采樣鞏膜紋理,以形成自然過渡的虹膜邊緣癌蓖。

瞳孔大小調(diào)節(jié)

我們需要對偏移后的虹膜UV做一定的remap處理達到這個效果瞬哼。首先求UV到原點的長度,以及方向向量租副,然后經(jīng)過一定對長度的處理得到一個新的長度坐慰,乘回方向向量就是我們要的原始UV數(shù)據(jù)。

float2 RemapUV(float2 uv)
{
    float lengthUV = length(uv);
    float2 uvNormalized = uv / lengthUV ;
    float newLength = 0;
    if (lengthUV  < _PupilRadius) 
    {
        newLength = lengthUV / _PupilRadius * 0.14;
    } else
    {
        newLength = (lengthUV - _PupilRadius) / (0.5 - _PupilRadius) * 0.36 + 0.14;
    }
    return uvNormalized * newLength;
}

上一段代碼中的0.14是原始紋理中瞳孔的半徑,這和我們采用的虹膜紋理有關结胀,需要手動調(diào)節(jié)赞咙。

高光

這個沒什么好說的,我目前只簡單的在Base Pass和Add Pass中寫了Phong高光公式糟港。


Github:https://github.com/techizgit/UnityPlayground

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀操,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秸抚,更是在濱河造成了極大的恐慌速和,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剥汤,死亡現(xiàn)場離奇詭異颠放,居然都是意外死亡,警方通過查閱死者的電腦和手機吭敢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門碰凶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鹿驼,你說我怎么就攤上這事欲低。” “怎么了畜晰?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵砾莱,是天一觀的道長。 經(jīng)常有香客問我舷蟀,道長恤磷,這世上最難降的妖魔是什么面哼? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任野宜,我火速辦了婚禮,結果婚禮上魔策,老公的妹妹穿的比我還像新娘匈子。我一直安慰自己,他們只是感情好闯袒,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布虎敦。 她就那樣靜靜地躺著,像睡著了一般政敢。 火紅的嫁衣襯著肌膚如雪其徙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天喷户,我揣著相機與錄音唾那,去河邊找鬼。 笑死褪尝,一個胖子當著我的面吹牛闹获,可吹牛的內(nèi)容都是我干的期犬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼避诽,長吁一口氣:“原來是場噩夢啊……” “哼龟虎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沙庐,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤鲤妥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拱雏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旭斥,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年古涧,在試婚紗的時候發(fā)現(xiàn)自己被綠了垂券。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡羡滑,死狀恐怖菇爪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柒昏,我是刑警寧澤凳宙,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站职祷,受9級特大地震影響氏涩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜有梆,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一是尖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泥耀,春花似錦饺汹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夸溶,卻和暖如春逸吵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缝裁。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工扫皱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓啸罢,卻偏偏與公主長得像编检,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扰才,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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