モバイルアプリにおける
アーティストフレンドリーな
水面表現戦略
はじめに
こういうシェーダの作り方と水面表現に対する考え方の話
水面表現のメリット
● 比較的表現しやすい(綺麗な水なら)
● 比較的処理負荷を軽くできる
● その割に見栄えがする
水面表現のデメリット
● ちゃんと設計しないとシェーダが無限に増える
○ 海、川、浅瀬、沖、水たまり、池...
はじめに
● 水を観察する
● 光の行方を追う
● 浅瀬用シェーダ
● アーティストフレンドリー?
● 水面表現戦略
目次
● 水を観察する
● 光の行方を追う
● 浅瀬用シェーダ
● アーティストフレンドリー?
● 水面表現戦略
目次
水を観察する
空の色を映す。
by Ibrahim Asad
https://www.pexels.com/photo/man-and-woman-holding-hand-walking-beside-body-of-water-during-sunset-1024992/
水を観察する
足元ほど反射しづらい。
by James Wheeler
https://www.pexels.com/photo/lake-pebbles-under-body-of-water-1574181/
水を観察する
深いところほど色が濃い&底が見えない。
by Ibrahim Asad
https://www.pexels.com/photo/bird-s-eye-view-of-sea-water-1456291/
水を観察する
屈折する。
by ajay bhargav GUDURU
https://www.pexels.com/photo/person-swimming-on-body-of-water-863988/
水を観察する
集光模様(コースティクス)が生まれる。
by Pixabay
https://freephotos.cc/ja/beach#417083
● 水を観察する
● 光の行方を追う
● 浅瀬用シェーダ
● アーティストフレンドリー?
● 水面表現戦略
目次
光の行方を追う
光が入射する。
水面
水底
光の行方を追う
入射した光は必ず反射 or 屈折する。(エネルギー保存の法則)
水面
水底
反射
屈折
光の行方を追う
反射はフレネル反射する。「足元ほど反射しづらい」のはこのため。
水面
水底
フレネル反射 : 入射角が大きいほど反射しやすい
光の行方を追う
屈折する角度は水と空気の相対屈折率に依る。
水面
水底
IOR(空気) : 約1
IOR(水) : 約1.33
光の行方を追う
水は青以外の波長を吸収しやすい。その結果、青っぽく色づく。
水面
水底
色んな波長が含まれる
青以外を吸収しやすい
光の行方を追う
底で反射することで底の色が反映される。
水面
水底
底の材質により
波長を吸収
光の行方を追う
深すぎると底がみえない
水底
光が途中で吸収されて
底まで届かない
光の行方を追う
光の干渉によりコースティクスが生まれる。
水面
水底
波の形状により光が集まる
● 水を観察する
● 光の行方を追う
● 浅瀬用シェーダ
● アーティストフレンドリー?
● 水面表現戦略
目次
浅瀬用シェーダ
ここに川を作る
使用アセット:Photoscanned MoutainsRocks PBR
https://assetstore.unity.com/packages/3d/environments/landscapes/photoscanned-moutainsrocks-pbr-130876
● 360度カメラみたいなテクスチャから反射方向の色を取る手法
● ソースコード
浅瀬用シェーダ(Reflectionパス)
反射はキューブマップ
浅瀬用シェーダ(Reflectionパス)
反射はキューブマップ
● 凹凸を疑似的に表す手法
● ソースコード
浅瀬用シェーダ(Reflectionパス)
ノーマルマップを反映
浅瀬用シェーダ(Reflectionパス)
ノーマルマップを反映
● Schlickの近似式を使う
● F0は法線方向から見た時の(入射角0度のときの)反射率
○ 物質ごとに決まった値を持つ(水は0.02)
● ソースコード
浅瀬用シェーダ(Reflectionパス)
フレネル反射
https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AC%E3%83%8D%E3%83%AB%E3%81%AE%E5%BC%8F
浅瀬用シェーダ(Reflectionパス)
フレネル反射
● 深さはテクスチャで定義
● 深さに応じた色をテクスチャ定義
● ソースコード
浅瀬用シェーダ(Refractionパス)
深いほど色をつける&不透明に
浅瀬用シェーダ(Refractionパス)
深いほど色をつける&不透明に
● ただのUVスクロール
● 水深が浅いところほど目立つようにしつつRGB値に加算
● ソースコード
浅瀬用シェーダ(Refractionパス)
コースティクス
浅瀬用シェーダ(Refractionパス)
コースティクス
● まずRefractionパスを乗算
● 次にReflectionパスをアルファブレンド
浅瀬用シェーダ(Refractionパス + Reflectionパス)
ブレンド
浅瀬用シェーダ
ブレンド
浅瀬用シェーダ
Before
浅瀬用シェーダ
After
浅瀬用シェーダ
補足と今後
● このほかに頂点変形もできるようにしてある
● 屈折表現は処理が増えるのでとりあえず入れてない
○ グラフィック設定でON/OFFできるようにして入れるかも
● キューブマップはHDRをLDRにエンコードして使えるようにしたい
○ HDRキューブマップを作るワークフローがあれば
● コースティクスちゃんとやりたい
● 水を観察する
● 光の行方を追う
● 浅瀬用シェーダ
● アーティストフレンドリー?
● 水面表現戦略
目次
アーティストフレンドリー?
※ 登場人物もやりとりもフィクションです
アーティストフレンドリー?
水面シェーダ作った!
シェーダ設定するだけで良い感じに!
※ 登場人物もやりとりもフィクションです
アーティストフレンドリー?
水面シェーダ作った!
シェーダ設定するだけで良い感じに!
もっといろいろ自由に調整したい!
※ 登場人物もやりとりもフィクションです
アーティストフレンドリー?
水面シェーダ作った!
シェーダ設定するだけで良い感じに!
もっといろいろ自由に調整したい!
RGB毎に水深に応じた減衰率を曲線で指定可能!
波の形はノーマルマップのほかにフローマップも適用可能!
さらに頂点変形を3種のアルゴリズムから設定可能!
ついでにIORも自由に設定可能!F0も自由に設定可能!
※ 登場人物もやりとりもフィクションです
アーティストフレンドリー?
水面シェーダ作った!
シェーダ設定するだけで良い感じに!
もっといろいろ自由に調整したい!
RGB毎に水深に応じた減衰率を曲線で指定可能!
波の形はノーマルマップのほかにフローマップも適用可能!
さらに頂点変形を3種のアルゴリズムから設定可能!
ついでにIORも自由に設定可能!F0も自由に設定可能!
わからん使いづらい
※ 登場人物もやりとりもフィクションです
アーティストフレンドリー?
調整の自由度
調整の難易度
アーティストフレンドリーバランス
アーティストフレンドリー?
調整の自由度
調整の難易度
フレンドリー!
アーティストフレンドリーバランス
アーティストフレンドリー?
● 水を観察する
● 光の行方を追う
● 浅瀬用シェーダ
● アーティストフレンドリー?
● 水面表現戦略
目次
水面表現戦略
方針
● 処理負荷的に浅瀬用シェーダが必要ないものはもっと軽いものを使いたい
● でもできるだけシェーダは減らしたい
次の3種類にわけることにした
1. 底の見えない深い海
2. ごく浅く波立たない水面(水たまり)
3. 上記以外 → 浅瀬用シェーダを使う
水面表現戦略
底の見えない深い海
by Peter Brown
https://www.pexels.com/photo/sea-and-sky-horizon-photo-706484/
水面表現戦略
底の見えない深い海
● 深さによる色の変化を考えなくていい(どこも深いから)
● コースティクスを考えなくていい(底が見えないから)
● 屈折を考えなくていい(底が見えないから)
● さらに今回は反射もいらない
○ 目立つところに使わないからテクスチャで表現できればいいとのこと
● テクスチャ2枚のUVスクロールをするだけのシェーダを作成
水面表現戦略
ごく浅く波立たない水面(水たまり)
by Wilson Vitorino
https://www.pexels.com/photo/people-walking-on-alley-1759094/
水面表現戦略
ごく浅く波立たない水面(水たまり)
● 深さによる色の変化を考えなくていい(浅いから)
● コースティクスを考えなくていい(波立たないから)
● 屈折を考えなくていい(浅くてそんなに目立たないから)
● 必要なのはキューブマップ反射 & 半透明描画
● このくらいなら背景の汎用シェーダでできるのでそれを使う
● 水の特徴を観察
● 水の表現を論理的に分析
● それをシェーダに落とし込む考え方を紹介
● 水面表現全体の戦略を紹介
まとめ
ご清聴ありがとうございました。

モバイルアプリにおけるアーティストフレンドリーな水面表現戦略