1 氷のようなシェーダーを書く

このシェーダー入門は、おもに数式に焦点をあてる。なぜかって?筆者が数学なんもわからんの民だからだ。まちがっていたらおしえてほしい。

この記事は 7日間でマスターするUnityシェーダ入門 を自分なりに理解しようと努めた内容だ。また、プログラムはここからの引用であることが多い。詳しく知りたかったら、原典を参照してほしい。


球があったとき、中心ほど透明度が高くて、端っこほど透明度が低いシェーダーを書く。

  • 端っこほど透明度が低いというのは、カメラのベクトルが法線のベクトルと違うほど透明度が低いということだ。
    • 法線: 平面があったとき、その平面に直角に立つ線のベクトルのこと。
  • ベクトルの違いは内積によってわかる。式を見てみよう。
    • 内積: ベクトルの方向のちがいを表したもの。

  • worldNormal\text{worldNormal} : オブジェクトの法線ベクトル。正規化されている。
    • 正規化: 0 から 1 までの値で表すこと。
  • viewDir\text{viewDir} : カメラのベクトル。正規化されている。
  • cosθ\cos \theta は、角度を -1 から 1 で表す。
  • x|x| は、xx の絶対値を表す。

worldNormalviewDir=worldNormalviewDircosθ=cosθ\text{worldNormal} \cdot \text{viewDir} = |\text{worldNormal}| \cdot |\text{viewDir}| \cdot \cos \theta = \cos \theta

  • worldNormalviewDir\text{worldNormal} \cdot \text{viewDir} は、ベクトルどうしの掛け算で、内積を求めている。
  • worldNormalviewDircosθ|\text{worldNormal}| \cdot |\text{viewDir}| \cdot \cos \theta は、内積を求める公式。
    • worldNormal|\text{worldNormal}|viewDir|\text{viewDir}| は正規化されていて、その絶対値を求めているので、かならず値は 1 になる。
  • cosθ\cos \theta は、計算の結果。worldNormalviewNormalcosθ|\text{worldNormal}| \cdot |\text{viewNormal}| \cdot \cos \theta が、実際には 11cosθ1 \cdot 1 \cdot \cos \theta なので、結果は cosθ\cos \theta になる。

コサイン関数に従うので、このような曲線を描く。

コサインカーブ。x=0、y=1を頂点とした山のかたち。

実装

float alpha = 1 - (abs(dot(IN.viewDir, IN.worldNormal)));
  • dot は、内積を求めている。
    • ベクトルが同じ方向を向いているとき、1 に近くなる。
    • ベクトルが逆の方向を向いているとき、-1 に近くなる。
  • abs は、絶対値を求めている。
    • ベクトルの方向が並行なとき、1 に近くなる。
    • ベクトルの方向が直角なとき、0 に近くなる。
  • 透明度は、並行なときは 0 に近く、直角なときは 1 に近づいてほしい。
    • 1 から値を引く。

Back Link