バグヒトツ

Unity を使ってゲーム開発日記

海シェーダー改造しました

 

海シェーダー改造しました、 少しマシになるかな

 

f:id:sigmalin:20180323140723g:plain

 

フレネル、スペキュラー 思いついたことを全部組み込む
一応モバイルで動かせる目標なので
あまり入れ過ぎないように頑張るつもりです

 

 気になるところ

  •  波がスムースではない

 

f:id:sigmalin:20180323141345p:plain

今のところまた解決案を見つからない
一応モバイルで運行つもりなので テッセレーションはなしでことで

 

  • みずあわほしい

エフェクト入れって 一応解決かな

 

  •  操作、NPC AIもほしい

夢が広がる

無限な海を作ってみた

はじめに

 本記事の作成は

www.slideshare.net

が提示した方法と

esprog.hatenablog.com

 

 WaveformProvider ソースコードを改造することによって成り立つもの

 

どちらも素晴らしい記事で大変勉強になりました

 

無限WaveformProvider

まず、波をシミュレートするテクスチャを無限に延伸するのは無理です
そのため、メインキャラ近くしか波生成しません
つまり、メインキャラを中心に波テクスチャを計算する

 

あと、位置移動もあるので
以前のフレームで描画したテクスチャを参照した位置も対応処理が必要

f:id:sigmalin:20180321125347p:plain

O  は前フレーム位置
O' はメインキャラの今フレーム位置
O'' は O' の前フレームの参照した位置
N  は移動量

数式で表すと O'' = O + N
これを波動方程式に代入すると一応解決

 

メッシュ最適化と変動UV

ここまで来ると、やはり

【Unite 2017 Tokyo】スマートフォンでどこまでできる?3Dゲームをぐりぐり動かすテクニック講座

が提示したメッシュ最適化も実装してみたい
海のメッシュをカメラと連動する
そうすることで頂点数を変えずにより高品質化できる


実装はそんなに難しくない
ただそうするとUVはメッシュの位置と角度によって違う値になる

解決案として ワールド座標からUV座標を推算する

f:id:sigmalin:20180321125628p:plain

c は波生成範囲の中心点
r は波生成範囲の長さ

a位置のUVは (a-c) / (r*0.5) + 0.5

計算は頂点シェーダーで行う

 

結果

f:id:sigmalin:20180321130159g:plain

 

ここまでの問題点を洗い出す

  •  海には見えない

       波シェーダーを改造して 海に見えるように頑張ります

  • 波生成範囲とキャラサイズのバランスがとれてない 理想の波が生成してない

       いろいろ弄って 試行錯誤しかできない

  • 魚雷撃たせたい

       叶うといいね

 

github.com