シェーダーはボトル内の液体の効果を実現します

言うまでもなく、最初の写真...
ここに写真の説明を挿入

完全なソースコードアドレス:

https://blog.csdn.net/ww1351646544/article/details/104917031

要求する:

1.液体効果は色を変えることができます。
2.液体は透明で、屈折効果があります。
3.さまざまなコンテナの形状に適応します。
4.移動する振幅によるディザリング。

実現のアイデア:

1.水平面の実現
これは比較的簡単で、一定の高さを設定し、それ以上の高さがある場合はオリジナルを破棄します。ただし、フラグメントの高さと実際のコントラストの高さのローカル座標はワールド座標であるため、座標変換操作が必要です。外部スクリプトによって渡される
、現在のポイントのクリッピングのワールド座標の高さである値を設定します
次に、各フラグメントの高さがワールド座標に変換され、それと比較されて、破棄するかどうかが決定されます。
注:背面要素の切断をオフにします。オフにしないと、上部から見たときに背面が不完全になります。

2.コンテナに適応します。
コンテナを液体としてコピーし、コンテナ自体より少し小さくして、液体シェーダーを配置するために使用します。

3.液体の左右のジッターは、
中心点のX値に基づいています。現在の点Xから中心点のXを引いて、距離を求めます(この距離は正または負の場合があります)。この距離は、問題の水平面の高さに影響を与えるために使用されます1。 。ジッタ値(正と負)は外部から入ってジッタの振幅に影響を与え、正と負はジッタの方向を制御して液体ジッタの効果を実現するために使用されます。

4.ジッターの振幅を計算します(この部分はC#コードで実装されます)。
各移動は、lastPosに各フレームの位置を記録し、配列に各lastPosを記録してから、lastPosが現在の位置と等しくなるまで現在の位置をlastPosに割り当てます。位置、および併置された配列に位置レコードがあります(これは、オブジェクトが移動され、完全に閉じて移動されたことを意味します)。このとき、配列内のすべてのレコードの平均値が計算され、この移動の速度を知ることで、ジッタの振幅を取得できます。
左右の浮遊スイングは正弦波で実現され、振幅は徐々に弱まります。

コアコード:

//与中心点距离(_LevelOfWaterOffsetScale是有正负值的摆动比例)
float centerDistance = (worldPos.x -_LevelOfWaterX)*_LevelOfWaterOffsetScale;

//波动值影响裁剪高度
float heightOffset = _LevelOfWaterY +centerDistance;

//高于指定高度则裁剪
if(worldPos.y>heightOffset)clip(-1);

皆さんのコミュニケーションと修正を歓迎します:QQ:262319244
以下に示すように、私とコミュニケーションを取り、同時に液体の水の実現のためのアイデアを収集するためのより良い方法があることを望んでいます。
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/ww1351646544/article/details/98632525