研究ノート 19

続き レンダリング8

金属と非金属の違いに関しては、それらはすべてスペキュラー ハイライトを持つことができ、金属のスペキュラー ハイライトはドミナントによって支配されますが、非金属はこのようではなく、ディフューズもあります。これは主に、ボール全体が光に面したときのランバートの明るさと光に面したときの暗さをまだ持っているという事実に反映されていますが、金属にはこの現象がまったくなく、全体の明るさが比較的均一です。

色に関しては、主なものは、金属のハイライトに直接または間接的に色があることです。

まず第一に、投影の本質が光を遮断することであると考えてください。これにより、光が少なくなり、全体的な明るさが影のない部分よりも暗くなります。

ここでのハイライトは依然としてアンビエント ハイライトであり、現時点ではアンビエント ライトの量によってのみ影響を受けます。

上記のように、金属球は柱によって遮られています. 遮られていますが、私たちの環境光はあらゆる方向から来ているので、その一部しか遮ることができません. ここで考えているのは、完全な鏡面反射光であるハイライトです.つまり、そのハイライトを見る各ポイントでは、その入射光は特定の方向にある必要があります.この特定の方向の光がブロックされている場合、このポイントのハイライトは実際に暗くなり、そうでない場合は影響を受けません.まったく。

すると、ここは確かに暗くなっており、黒くなっているのは金属球に映った柱で、光を当てると鏡面で反射した光が見えます。これは、ピラー自体の色 (ピラーが光を反射する方法を決定する) とその光の状態によって自然に影響を受けます。

したがって、これは物理的に正しい結果です。

不純物を考慮してください。

これはいくつかのプローブの議論です. 位置が中央にない場合, より現実的な効果を得るために別のプローブを作成する必要があります.

しかし実際には 1 つだけで行うのは正しくありません. 実際に取得したいのは各フラグメントの周囲の環境光です. しかし、オブジェクトごとに 1 つのプローブがある場合、すべてのフラグメントがこのプローブを共有し、各フラグメントはデフォルトで It になりますはセンタープローブの位置にあるので、記録は完全に正確ではありませんが、この誤差は考慮されなくなり、効果はすでにかなり良好です。

ボールを平らな面に置き換えると、効果は上記のようになります。実際、この現実からの逸脱はかなり大きいです。

上記の形成の理由は、実際には以前のボールの分析と似ています. 分析する必要があるだけです. 実際の状況に応じて、特定のポイントとその反射光の経路がどうあるべきかを調べます. そして、ここで実際のサンプリングが行われれば問題ありません。

厚くなる理由を例に挙げると、次のようになります。

ここの柱を映してはいけない部分は、今おおまかに視線が向いているので、その映り込みを計算すると中心にあると考えて立方体をサンプリングして柱を表示します。そして、元の視野角がより側面に偏っている反射点のみ

例えばここの境界点では過去と視線がつながっており、入射光は右上から来るはずですが、この点を中央に置いてサンプリングすると右上からサンプリングされるので、サンプリングは柱に到達できません。

そして偏角が比較的小さいものは柱に反射しないはずなのですが、中央に配置すると柱にサンプリングされるため、柱にサンプリングされる面積が多くなるため、柱が太く見えてしまいます。

さらに、ピラーは現在の視野角で短くなります。

この観点からすると長くなり、常にこのように分析されます。

もちろん、ここに置かれたプローブの位置も、柱に向いているかどうかに関係なく、何らかの影響を与えます。

画角がずれるとより大きな問題が発生しますが、すべて同じように分析されます。

実際、ここでの近似は良い効果をもたらすことを望んでいます. 実際には、2 つの状況があります: 反射されたオブジェクトが十分に離れているため、フラグメントが中心でサンプリングされたと見なされた場合に大きなエラーは発生しません。

球も面も十分に小さく、中心に置いた場合、中心ではなく中心とみなすような状況があっても、そのズレは大きくなりません。小さな距離。

これも、ボールの効果が表面の効果よりも優れている理由です。それは小さいです。

要するに、このすべての理由は、サンプリング時に、実際のサンプリング ライトをサンプリング前に中心に変換するためです。これにより、いくつかのエラーが発生します。

青を使用する代わりに、下の青の線を使用して緑を推測する必要があります。

それがここで言うことです。

一般的には交点です。

でも外側の黒い枠は理想なので実寸はありませんが実寸はどうでもいいです。

プローブ ボックスのオフセットを変更すると、ボックス全体がシフトします. サンプリング時には、環境は常にボールの位置でサンプリングされることに注意してください. ボックス オフセットの効果は、ボックス内のオブジェクトが変更されたことです. 役割箱の中の物体にこのプローブを使わせます。

(メッセージ数 119) Unity Shader - 反射効果 (CubeMap、Reflection Probe、Planar Reflection、Screen Space Reflection)_puppet_master's blog - CSDN blog_unity Ground Reflection

ブログには参考になるものがたくさんあります。ゲーム効果のレプリカ。

(メッセージ数 119) Unity Shader!!!_puppet_master のブログ - CSDN ブログ

上記のように反射方向を修正した後、実際には要件があります。これが、プローブのボックスがシーンの境界と一致している必要がある理由です (この一貫性を確保するために、プローブを配置する必要がある場合があります)シーンが中心にあり、ボックス配置後の中心がシーンの中心にならない場合があります。このとき、以前は理解されていなかったオフセット オプションが必要です。)

この写真に戻ると、まず第一に、下の青い光が正しい反射光であることは間違いありませんが、問題は、青い光とキューブマップ ボックスの交点にある画像が実際に、実際の反射?

これは必ずしもそうではありません。

そのような紫色のボールが空間にある場合、ボールの画像はキューブマップの交点に保存されますが、下の反射パスから判断すると、これはこの視点からはまったく見えないはずです。

そのほか:

もしそうなら、紫色のボールと中心点の間に何もないと仮定すると、交差点の画像は再びボールの画像を記録しますが、青色の方向線を下に延長すると、見えるのはこの紫色のボールではありません. 、これもそうではありません。

つまり、紫色のボールがボックスの境界に配置されたときで、キューブマップは実際に青色の反射方向に見えるものを格納します。

これには、ボックス全体とマップの境界が一致し、境界内に何もないことも必要です。

ために

このオプション。違いは、箱の外にあるものです。

ミラーの一部がプローブ領域の内側にあり、一部がプローブの外側にあるとします。上記のアルゴリズムによると、キューブマップによってサンプリングされたすべてのものはプローブ範囲の端に配置されていると考えられますが、これはスカイボックスの効果にはあまり影響しません。

ボックス プロジェクション オプションを有効にしない場合は、プロセスに従うだけで、次の結論を得ることができます。

この部分は範囲外で、計算するフラグメントは範囲外で、最小計算時間は負の数であるため、サンプリングするキューブマップはボックス全体の下半分であり、空ではなく地面に反射しているため、ここでの効果は明ら​​かに間違っています。

 

そして、チェックが入っていれば、

上記は範囲外ではありません。以下の範囲外との違いを注意深く観察してください。

ここには伸びがあり、右側の境界をよく見ると、右側が少し拡大されていることがわかります。

結論はそれをチェックすることです.範囲を超えた後,キューブマップの対応する側を拡大します.実際,これはこのオプションの機能でもあります.プローブ範囲を超えた部分がまだ反映されていることを確認することです.キューブマップの正しい位置情報。つまり、超えた範囲はキューブマップの上半分に格納された情報を反映したままであり、屈折のように撃ち落とされるとは言えません。(ただし、位置が境界の外にあり、キューブマップの格納は境界上の情報と見なされるため、オブジェクトを境界の外側の境界に反射させる効果も少し奇妙で、最終的な結果が正しくない場合があります。 . あなたのオブジェクト自体が境界の外側にある可能性があります, 彼はそれが境界上にあると考えています, そして私たちの反射は彼を境界の外側に反映しています, それは正しいかもしれません. しかし、この状況は関係するべきではありません, 誰がミラーをフレームの外に置いたとしても.暇です。)

エントリからデビエーションまでのユニティ リフレクション (BoxProjection から Fake Interior) - Zhihu (zhihu.com)

ここで、ミラーがプローブの範囲内にある限り、効果は正しくなります。上記の対称接続状態が必要な場合は、ピラーが境界上にある必要があるため、慎重にサイズを調整する必要があります。ミラーは柱に苦しむ必要があります。

ここで調整のポイントが 1 つあります。つまり、柱を境界線上に配置し、柱に太さを持たせます。ほぼ完璧な効果を得るには、境界線上にどのように配置すればよいでしょうか。

これは実際には境界上にあると考えていることを意味し、実際に境界上にある場合、効果は完全に正しいはずです。

実際、境界上にあると考えるということは、中心点で見える面が境界上にあるということです。それから配置するときは、過去に見た面が境界上にあることを確認してください。

これは完璧な答えです。

もちろん、ここでは地面が鏡に映ってはいけません。これは、高さを調整することで実現できます。

この時、ボールの反射に変化させる効果も良く、位置によってボールの反射を変えることに成功しました。

実はこれが外箱射影の働きを説明しており、つまりこのオプションがチェックされているか否かはここで対応するはずであり、チェックされている場合は w 成分が 0 より大きくなり、チェックされていない場合は 0 より小さくなります。 .

したがって、この関数は、修正されているかどうかです。(本来の機能はマクロを使えるようにすることで、マクロの中にこの条件判定があります。しかし、この機能は絶対にそれだけの判定ではありません。前回の比較によると、関連する違いがあります。)

さらに、ここでの if 判定、シェーダーの if ブランチが最適化され、割り当て判定は 1 つだけ残ります。

しかし、このブランチを保持したい場合は、コンパイラに伝えてください。

先ほど試したボックスの外側でより良い反射効果を得るために、ここで試した 2 つは完全ではありません。

1 つは範囲を直接拡大することですが、サンプリングの中心がボックスの内側にあるため、外側のボールの表面での反射効果は依然として内側にあり、効果は正しくありません。

もう 1 つのプローブを追加するという別の操作方法もありますが、これは移行で問題を引き起こし、移行はミューテーションになります。

次に、補間を開始します。

しかし、上記の言い回しは間違っています. ここで、2 番目のテクスチャ サンプリングは、最初のものに依存する必要があります。

前に黒くなったバグ、実はよく考えてみると、この黒いボール、つまり、金属性と滑らかさが1に引っ張られて、このようになりました。実際、ここでは空のボールはまだ黒です。これは、空のボールが効果を持たないことを意味します。これが、ここで周囲光の反射の強度係数が 0 と書かれている理由です。

ここにはまだ問題があります.2つのプローブがあります.上部の強度乗数を半分などの小さな値に変更すると、それらの真ん中にボールが移動します.ボールがその場所に移動するとそれらが重なったところ、明るさが急に明るくなりました。この問題の理由はわかりません. 上記の強度乗数を 0.9 以上など、より大きな値に変更できます。1 で問題ありません。

さらに奇妙なのは、強度乗数を 0 に調整すると、すべてが黒くなるはずなのに、境界がまだ明るいことです。感動。. . .

関連するブレンド設定。

ミキシングが完了した後は、サンプリングに手間がかかると考えられ、場合によっては 2 番目のキューブマップをサンプリングする必要がまったくないため、サンプリングするかどうかの判断が行われます。無駄な仕事をしないでください。

一部のプラットフォームはここで最適化されており、一部のプラットフォームは混在できません。

 

無限の反射効果を実現するには、地面の鏡を静的に変更する必要があります。

より多くの反射

————————————————————————————————————————————————— —————————————————————————————————

レンダリング 9

カスタム GUI を作成する場合は、一般的な操作プロセスである C# 操作を使用する必要があります。

クラスが ShaderGUI から継承されていることを確認してください。

彼は、GUI クラスの新しいバージョンです。

C# をカスタマイズしたら、それをマテリアルにドラッグします。役割を果たしたい場合は、シェーダーを宣言する必要があります。

この文は本文の最後に追加されます。

宣言後は、マテリアル パネルでの表示方法を決定する関数をオーバーライドするだけです。

ここでは、標準的な色と書き方を真似したいと思います。

次に、単一の属性の場合、表示されるものが属性値にリンクされるように、最初にこの属性を取得する必要があります。

次に、テキストまたはツール ヒント用に、GUIContent が作成されます。

色味の場合、これは属性にリンクされており、属性と組み合わせて作成する必要があります

スケールとオフセットは非常に特殊で、別の変数を作成する必要はなく、関数を直接作成するだけです。

実際、ここでは 1 行で 3 つのことが定義されていますが、関数インターフェイスの観点からは、これら 3 つのことは無関係です。

パネルに表示するものには、大まかに 2 種類あります。1 つは属性で、もう 1 つは補足テキストです。

実際、ここのフォーマットは補足テキストを書く必要はありません。つまり、補足テキストと属性の間に関係はありません。ここでのアトリビュートの作成にはアトリビュート オブジェクトが必要で、unity はそのタイプに応じて対応する GUI を作成します。次に、その横にテキストを追加して補足します。

オフセットについては特殊な属性ですが、他の属性に付随する属性なので、ここはちょっと特殊です。

ラベルに関しては、パッケージの簡素化もここで実行できます。属性を渡すだけで、属性に応じて表示名が内部的に自動的に取得され、ツール ヒントに渡されます。

ここでは、通常は画像、ラベル、およびバンプ スケールを追加します. これらはすべて基本的な操作です. 属性とラベルは関数を呼び出して、線を取得するだけです.

ここで 1 つ言っておく必要があります。標準のバンプ スケールは、法線マップが正しく割り当てられた後にのみ表示されるため、ここで判断を追加できます。

ここでのポイントは 2 つあります。1 つは、属性とラベルが関数によって取得され、エディターに追加されると、使用する関数が変更されることです。

第二に、ラベルの説明と属性は完全に独立していると言われましたが、これは完全ではありません. ここでのパラメータは、ラベルを指定することを可能にしますが、色合いは指定する必要はありません.

たぶん、1行のラベルを指定しますか??

次に、ここでインデント レベルを変更して整列効果を実現します。

この時点で、マップの最初のセットが完了し、次が 2 番目のセットで、ゲームプレイは同じです。

 

これは全体的なコード構造であり、次に Domain と DoSecondary 自体です

ここで実際に金属性について質問があります。これは、金属属性がモデル全体に​​直接適用されるためです。つまり、モデル全体の表面のすべての金属性が同じであり、マテリアルのパフォーマンスに影響します。

したがって、メタリック マップが表示され、テクセルごとに特定の金属度が設定されます。

全体がデフォルトの ShaderGUI 用であり、独自に定義された GUI を使用するため、ここでのこの種の noScaleOffset は役に立ちません。

ここにメタルネス マップを追加した後、メタルネスの計算方法を変更する必要があるため、ここに関数をカプセル化します。

また、GUI を少し調整します。

これは全体的なコード構造であり、次に Domain と DoSecondary 自体です

ここで実際に金属性について質問があります。これは、金属属性がモデル全体に​​直接適用されるためです。つまり、モデル全体の表面のすべての金属性が同じであり、マテリアルのパフォーマンスに影響します。

したがって、メタリック マップが表示され、テクセルごとに特定の金属度が設定されます。

全体がデフォルトの ShaderGUI 用であり、独自に定義された GUI を使用するため、ここでのこの種の noScaleOffset は役に立ちません。

ここにメタルネス マップを追加した後、メタルネスの計算方法を変更する必要があるため、ここに関数をカプセル化します。

また、GUI を少し調整します。

ここの GUI にはもう 1 つの詳細があり、これは前に処理されたバンプ スケールの正反対です.ここでは、テクスチャがある場合は値は必要なく、テクスチャがない場合は値が使用されます。

 

おすすめ

転載: blog.csdn.net/yinianbaifaI/article/details/127607895