日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【头发渲染】Technical Artist的不归路 —— Kajiya-Kay Shading

發布時間:2023/12/20 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【头发渲染】Technical Artist的不归路 —— Kajiya-Kay Shading 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

https://blog.csdn.net/noahzuo/article/details/51162472

在游戲中,頭發一直是比較難以駕馭。頭發難的地方有三塊,一在模擬,二在著色,三在工具鏈適配。目前很多游戲的開發通常都會避免長發和散發,只采用短發。

但是哪怕是短發,其著色也是非常重要的一環。


我自己也看到有不少團隊的頭發完全使用貼圖來進行著色。這樣的著色的優點在于在特定的光照與攝像機角度下能夠有很精彩的表現,但是如果光照條件與攝像機角度變化后,頭發的表現就會非常怪異。

這篇博客介紹了Kajiya-Kay Shading,一種簡單而酷炫的頭發渲染著色器,原文傳送門。

Kajiya-Kay Model

Kajiya-Kay Model與其他Shading Model顯著不同一點的就是它使用的是發絲的切線而不是這一點的法線來進行計算。在這個模型中,Specular N.H為:?

sin(T,H)speculartiy=1?dot(T,H)2????????????speculartiysin?(T,H)speculartiy=1?dot(T,H)2speculartiy
而不是:?
dot(N,H)specularitydot(N,H)specularity

但是需要注意的是,Kajiya-Kay的著色模型需要比較正確的自陰影。否則相對來講會太亮。

Vertex Shader

VS沒有什么特別的,僅僅是將T, N, V, L, AO這些數值傳遞給PS。

Pixel Shader

  • Diffuse Lighting.?
    Kajiya-Kay 的diffuse可以使用衰弱的N.L,也可以使用sin(T, L)。正如前面提到的,sin(T, L)需要有自陰影,否則會太亮。

  • Specular Highlights?
    在Kajiya-Kay的著色模型中,我們有兩個偏移的Specular量,從而表現頭發的高光(下圖來自本人小妹的自拍)。?

Specular Highlights

為了產生沿著發絲方向偏移的高光,我們需要將切線沿著法線方向進行一個偏移,如下圖:?

正向的偏移意味著向發根的高光偏移,而負向的偏移則意味著偏向發梢。

在這個著色模型中,我們通過一張紋理來表示偏移量:?

代碼如下:

float3 ShiftTangent(float3 T, float3 N, float shift) {float3 shiftedT = T + (shift * N);return normalize(shiftedT); }

發絲光照

在這個著色模型中,我們使用半角向量(half-angle vector)。用reflection與view向量也可以,但是會使Shader略顯復雜。

在兩個高光中,可以使用不同的顏色、specular exponent以及不同的切線偏移度。第一層高光可以直接計算,而第二層高光表現的主要是閃耀的情況——通過noise texture進行調整。

代碼如下:

float StrandSpecular(float3 T, float3 V, float L, float exponent) {float3 H = normalize(L + V);float dotTH = dot(T, H);float sinTH = sqrt(1.0 - dotTH*dotTH);float dirAtten = smoothstep(-1.0, 0.0, dot(T, H));return dirAtten * pow(sinTH, exponent); }

值得一提的是,對于dirAtten這個變量的意義我一直不太了解,在stackoverflow上面找到了答案,傳送門。

最終代碼

float4 HairLighting (float3 tangent, float3 normal, float3 lightVec, float3 viewVec, float2 uv, float ambOcc) {// shift tangentsfloat shiftTex = tex2D(tSpecShift, uv) - 0.5;float3 t1 = ShiftTangent(tangent, normal, primaryShift + shiftTex);float3 t2 = ShiftTangent(tangent, normal, secondaryShift + shiftTex);// diffuse lightingfloat3 diffuse = saturate(lerp(0.25, 1.0, dot(normal, lightVec)));// specular lightingfloat3 specular = specularColor1 * StrandSpecular(t1, viewVec, lightVec, specExp1);// add second specular termfloat specMask = tex2D(tSpecMask, uv); specular += specularColor2 * specMask * StrandSpecular(t2, viewVec, lightVec, specExp2);// Final colorfloat4 o;o.rgb = (diffuse + specular) * tex2D(tBase, uv) * lightColor;o.rgb *= ambOcc; o.a = tex2D(tAlpha, uv);return o; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

最終效果

以后會在Unreal Engine 4中實現Kajiya-Kay Shading……

<全文完>

總結

以上是生活随笔為你收集整理的【头发渲染】Technical Artist的不归路 —— Kajiya-Kay Shading的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。