どうやってUE4で透明な氷を作るか
原文:
氷塊は生活に欠かせないものですが、エンジンで氷の質感や物性を復元するのはかなり難しいと思います。私も簡単な方法でシミュレーションしただけですが、制作プロセスを紹介いたします。まずは近距離での写真をご覧ください。
比較的透明な氷
透明度の低い氷
視点による変化
Shader全体に使用されたのは、照明のないMaskのShading Modelです。主な制作手順は、次の部分に分けることができます。
内部体積(Internal Volume)、表面反射、半透明シミュレーション、屈折、半透明の影、およびいくつかの色の変化。
内部体積制作
内部体積の制作は記事「UE4 で raymarch を使ってメッシュ水 (サンプリング スタンプ) (中国語注意)を如何に実装するか」と同じなので、ここでは詳しく説明しません。
コードを知らない方は、Parallax Occlusion Mappingで実装しましょう. パフォーマンスはより消費されますが、効果は同じです。
Raymarch Perlin Noise 後の効果
パラメータ設定
内部体積 ノード グラフについては、記事「UE4 で raymarch を使ってメッシュ水 (サンプリング スタンプ)(中国語注意) を如何に実装するか」(サンプリング テクスチャ) を参照できます、スタンプを Perlin Noise に置き換えてください。
半透明のシミュレーション
それでは、最も重要な部分に移ります。照明のない マスク モードを使用しているため、半透明ミュレーションは、Cubemap をオブジェクトに貼り付ける方法を使いました。次の記事においては、低層を変更して実装しましたが、こちらの実装は少し高層に位置しますけれども、原理は大体同じです。興味がある方は参考してください。
リアルタイムCubemapの場合は、Scene Capture Cubeを使ってキャプチャする必要があるが、静的な場合は、シーンを直接Cubemapにして貼り付けるだけで良い。新しい BP Actorを作った後、新しいカメラを作成します。それから、Cube Render Targetを作って、Cube Textureをカメラのスロット (throttle)に挿入します。
Cubeカメラ
カメラスロット
マテリアルに戻ると、最初にCubeスタンプ(つまり、新しく作成されたCube Render Target) をマテリアル エディタに入れ、次に UV ポートをCamera Vectorに接続し、最後にそれを自己照明に出力します。以下は逆効果です。
UV としてのCamera Vector
Z 軸の逆効果
それでは、最初に Camera Vector の b 軸を逆にして効果を確認してみましょう。
逆カメラ ベクトル B 軸
B軸逆の効果
ほとんど同じく見えるでしょう?しかし、角度が間違っているため、Cubemap を回転させる必要があります。ここで RotateAboutAxis を使用して回転させます。回転軸は 0, 0, 1 (z 軸) で、positionは Camera Vector で、回転後にCamera Vectorを追加します。 (Camera Vector を基準に回転しているため)、最後に Normalize (UV 空間は 0-1)、Z 軸を反転して Cube Texture の UV に接続するだけでよい。回転角度は 270 度です。(マテリアルエディタではラジアンで計算されるので、360で割って度単位に変換します)。
透明をシミュレートする
透明の効果をシミュレートする
まあまあ良いですね。でも、Cubemapのため、完全にマッチすることはできなくて屈折の高いオブジェクトにしか適していません。また、カメラでCubemapをキャプチャすると、それ自体もキャプチャされます. それをカーリングする方法については最後に説明します.
反射
反射は非常に簡単に言えます。同じくCube Texture (つまり、新しく作成されたCube Render Targetです) を使います。続いては、Reflect Vectorを使用して UV に接続します。最後に、Lerp で反射と透明度の混合比を制御します。このように、透明度へのコントロールが実現されました。
混合反射と半透明
Lerpによる混合比率の制御
混色
内部体積と上記の効果が得られたら、それらを混ぜます。内部体積をMaskとして 2 つの不透明度を混合し (実は内部体積と透明をシミュレートする Lerp 値です。ただ2 つの Lerp が必要で、反射効果は最後に混合されます)、フレネルを使用して遠方と近方の不透明度を制御します、近方は透けて見えますが、遠方は透けません。
シミュレート半透明と内部体積による透明度の混合
透明度混合
透明度と内部体積をブレンドした結果
パラメータ設定
上記の効果を作成した後、引き続き上部反射の効果を混合し、フレネルで反射強度の変化 (実際にはroughnessの変化を指します) を制御します。
混合反射効果の反射値を 0.9 に設定する
反射後を効果を混合した後、ハイライトが出てきました。
最後に、色の上にフレネルのレイヤーを追加すれば完成です。
カラーフレネル
カラーフレネル効果
屈折
屈折も簡単です。その原理は半透明のCube Textureを乱すことです。半透明の UV の RG 軸にスタンプを乗算するだけで済みます.もちろん、内部堆積を適応するため、内部体積の UV を屈折マップの UV として使用できます。
屈折効果 (このNoise Mapはあまり良くありません)
基本的な効果ができました。それから、偽の半透明の影を作成します。
半透明の影
この部分はDither Mask法を使用します。次にShadow Pass Switchを使用して現在の影を置き換えます (実際、Dither後のモデルは影を投射するモデルとして使用されます)。 ViewSpace の B 軸でPixel Normal (つまり、モデルの地面での投影) をとり、abs から負の数を取り除いて反転してフレネルのような効果を出しますが、フレネルのように視点によってすごく変化していくように見えません。 Power で範囲をコントロールし、最後に Dither に出力し、Shadow Pass Switch に接続してから Opacity Mask に出力すると、偽の半透明の影 (Dither 影) が得られます。
半透明の影 ノード
Pixel Normal で作成された効果
半透明の影
透明度の変化
translucentモードでの透明変化
最後に全体的なノード示します:
全体のノード
パラメータ設定
追加の質問: カメラで特定のオブジェクトのみをキャプチャするにはどうすればよいですか?
この質問がよく聞かれました。ここでは、特定のオブジェクトのみをレンダリングするように設定する方法を説明します。
カーリングする前に自身が撮れてしまう
まず、新しいレイヤーを作成し、表示するものを選択してレイヤーに追加します。
レイヤーのアウトライン
表示Actorを追加
BP のカメラでは、リスト オブジェクトのみを表示するように設定します。
カメラを設定する
次に、リストをカメラに渡し、freshを使って手動更新します。それは、非play状態のマテリアルでは Cube Texture がリアルタイムで更新されないためです。
リストをカメラに渡す
最後に、新しく作成した Actor Layer 変数のレイヤー名を指定して、選択したレイヤーのオブジェクトのみを表示します。
指定画層
自分自身をカーリング後の効果
UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com
UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com