LoginSignup
0
0

More than 1 year has passed since last update.

Explore - "Unity URP Tutorial - Orthographic Fog Plane Shader"

Last updated at Posted at 2021-11-24

上記の動画で使われてる技術(特に霧のshader graph)を調べていくなりよ~。

Orthographic Depth

  • 使われてるノード一覧

    • Camera
    • Lerp
    • Scene Depth
  • 役割
    カメラからの距離を取得。

  • やってること
    "Camera"の手前のクリップ面までの距離(Near Plane)と奥側のクリップ面(Far Plane)までの距離を"Scene Depth"(カメラからオブジェクトまでの距離で0~1で表される)の値を媒介変数として、"Lerp"で線形補完をし、開始を手前の面までの距離、終了を奥の面までの距離としたものを1つ、それを逆にしたものを1つの計2つ作っている。
    ※動画では調整してPlaneがScene Depthの値として使われないようになっている?のでPlaneの奥に見える最も手前のものまでの距離となっている。

Reverse Z Check

  • 使われているノード一覧

    • Camera
    • Comparison
    • Branch
  • 役割
    Depth BufferにReversed Zを使っているか否かで距離の値が変わるのでDepth Bufferの判定をし、使う値を選択。

  • やってること
    "Camera"の"Z Buffer Sign"(Reverse Zを使っていれば-1そうでなければ1を返す)を"Comparison"を使って確認するために作成。その結果を"Branch"に接続し、もしTrueならFarPlane-NearPlane間での値をそうでなければNearPlane-FarPlane間の値を使うように条件分けをしている。

  • 補足
    nvidiaの解説より、"ただし、ここで重要な実際の結果は次のとおりです。逆Zマッピングは基本的に魔法です"らしいから深追いしない。ヤクの毛は刈ってはいけない...

Calculate World Pos from Scene Depth

  • 使われているノード一覧

    • Negate
    • Position
    • Split
    • Vector3
    • Transform
    • Subtract
    • Object
  • 役割
    カメラからの奥行きは取得できたのでカメラ視点からのX,Yを取得しそれらをworld座標に変換、オブジェクトの座標を弾いてワールド座標で原点にあった場合の座標としている。

  • やってること
    "Position"を使い、カメラ視点でのメッシュの頂点/フラグメントの位置を取得しそれをSplitでX座標とY座標の位置のみ抽出。また"Negate"(入力値の符号を反転するだけ)を使って上記で得た値を符号反転した値をZとし、"Vector3"を作成。"Transform"を使って先のベクトルをView座標から、World座標に変換。
    その後今得た値から、オブジェクト本体のworld座標のベクトルを引く。

Handle Fog(based on Normal Direction)

  • 使われているノード一覧

    • Transform
    • Normal Vector
    • Normalize
    • Dot Product
    • Negate
    • Saturate
  • 役割
    内積を使っている理由は(解説されていないのでおそらくになる)内積はベクトルAとBの絶対値の積にcosθをかけたものとなる。またBのAに対する正射影に対してAの絶対値をかけたものになるのでみている角度がPlaneに対して平行になる程、結果は小さくなるし(見る角度が浅くなる程霧が薄くなる)、また絶対値を利用していることから遠いところほど大きな結果になる(遠いところほど霧が濃くなる)この2つを目的としているから?またNegateをしているのは裏側から見た時に霧が見えないようにするためだと思われ。saturateをしているのは単にアルファが0~1なのと、特に補正をかけるとかじゃなく、ある閾値以上の結果は全て1にしても霧のエフェクトとしては十分だからか?

  • やっていること
     計算してきた値と、正規化された法線ベクトルのドット積を計算。それを0から1までの値にする。

出力部

*使われているノード一覧
* Color
* Split
* Multiply

*役割
ここまでで近いところほどalphaが小さく、遠いところほどalphaが大きいという入力が得られたのでそれを利用してfragemntの最終調整をしているだけ。

  • やっていること
    1. "Color"の値を"Fragmentに接続
    2. "Color"のalphaを"Split"で抽出し、上記の計算で得た値と掛け合わせる。そしてその結果を"Fragment"のalphaに接続。

感想

わからん。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0