イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

Shader 水面の作り方 メモ

ここさえ読めれば出来る。

CustomRenderTextureを使って波紋エフェクトを作る - e.blog

以下、引用しているShaderやコードはこちらの記事から引用しているものとします。

 

WaveShaderは波動方程式を解き、c.rに現在の波の高さ、c.gに1フレーム前の波の高さを入力している。

 

波動方程式の理解:

float k = (2.0 * c.r) - c.g;
float p = (k + _S2 * (
    tex2D(_SelfTexture2D, uv - duv.zy).r +
    tex2D(_SelfTexture2D, uv + duv.zy).r +
    tex2D(_SelfTexture2D, uv - duv.xz).r +
    tex2D(_SelfTexture2D, uv + duv.xz).r - 4.0 * c.r
)) * _Atten;    

 

その地点の新たな波の高さを求める場合、ラプラシアンフィルタに従い、周囲とその地点の現在の波の高さを畳み込めば新たな波の高さとなります。周囲の波と高さと現在の波の高さを使って計算すれば、次の波の高さが割り出せる、ということはイメージ出来ると思います。専門分野でないなら公式のようにこういうものだと暗記しておけばいいと思います。

 

偏微分:複数変数がある場合、一つの変数を除いて全て定数として扱い微分する。

偏微分の意味とやり方

 

HeightMapは、その地点の上下・左右のベクトルを外積させることで法線ベクトルを割り出し、それを基に反射の計算をしています。

外積を求めるとその2ベクトルの法線ベクトルとなる、と覚えておけばいいと思います。

光の反射の基礎:

【Unityシェーダ入門】ランバート拡散照明モデルを試す - おもちゃラボ

この例だと光の反射の処理を書いているが、surfシェーダを使って法線ベクトルを渡すだけでもいいと思う。

 

 

CustomRenderTextureはVRChatではワールドでは使用出来るが、アバターに仕込む場合はほとんど動作しない。

CustomRenderTextureは通常のシェーダと異なり1フレーム前の状態が保存されておりそれが更新される形で作動する。

初期状態はInitializeMode=>Textureにセットする

カスタムレンダーテクスチャ - Unity マニュアル