研究ノート 22

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

レンダリング12

まず、前のセクションの透明効果については、影に関連する問題を扱っていませんでしたが、透過影で上記の結果が得られた場合、

実際、デバッガーを使用してこの現象を分析できます。

これはレンダリングの最初のステップです. このことからわかるように, 床をレンダリングするとその影が出てきます. ここで欠けている部分が 1 つあります. その理由は実際には影の原理です. それはシャドウ マップ/

シャドウ化する必要があるのにシャドウ化されていないブロックは、深度テストに失敗する必要があります。

実際、シャドウ マップを生成するときは、完全な不透明度に従って、透明なオブジェクトの深度を一番上に書き込みます。

なので、隙間の部分に書いているのは、側面の透明な物体の実際の奥行きです。したがって、レンダリングに関しては、この分析に問題があるようです。

ここの問題は直接書き込み時に問題があるようで、2つ目は隙間の部分でバッファに直接書き込まれていないので、最終的な色はこの床です

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ここにはいくつかの問題があり、正しい分析はないようです。. . .

次のステップは、影のクリッピングです。

クリップ操作では、アルファを使用する必要があります。つまり、アルベドをサンプリングする必要があります。

するとシャドウキャスターのコードを変更する必要があり、また、以前のシャドウキャスターは点光源とその他の光源に分かれているため、書くとそのまま#if電光、#elseその他の光となります。

つまり、コードの 2 つのコピーを作成します。ここでサンプリング アルファ コードを追加すると (これもさまざまな判断が必要です)、2 回実行する必要があるため、前の 2 つのブランチの同じ部分をマージして書き直します。

1 つにマージしてから、アルファ サンプリング コードを追加します。

このシャドウの cginc は、使用時にメインプログラムのパスで展開されるため、変数の定義は当然ここにあります。

これは単純化されたマクロ判断です。

ここで、UV に判定を追加したときに、頂点データには追加しなかったのですが、その理由はわかりません。. . .

したがって、操作プロセスは次のとおりです。

UV判定マクロを作成し、判定に応じてUV座標を取得 取得後、フラグメントをサンプリングしてアルファを取得し、アルファでクリッピングできます

最後に、この 2 つを忘れないでください。マクロを使用するため、パネルとリンクできるように、マクロ用にコンパイル済みの命令を作成する必要があります。

キーワードはパネルで指定され、ここでキーワードが役割を果たすため、ここでは、指定されたキーワードに従って、対応するマクロが定義され、その後の条件判断が意味を持つようになります。

ここで間違いやすい点があります、つまりuvの種類についてですが、影を考えるとこのような一対のuvしかないのに、間違えたり急いでfloatと書いたりすることがあります。

このとき、割り当てエラーにつながり、サンプリングエラーが発生しますので、今後テクスチャのサンプリング結果に問題が発生した場合は、タイプが正しく記述されているかどうかを確認してください。

このmulマトリックスとUnityパッケージの違いについて

w コンポーネントはデフォルトで 1 ですが、コンパイラはデフォルトでは設定せず、検証操作が必要になる場合があるため、公式のものを使用し、検出と検証を行わずに 4 番目のコンポーネントとして 1 を直接使用します。

ここでの部分的な影, 最初にその主なアイデアについて話しましょう, そして最初にこのタイプの透明なオブジェクトの影のアイデアについて話しましょう. 実際, この例では, それらはすべて立方体の影を透過します.

また、clip を使用して、シャドウ マップを生成するときにオブジェクトの一部のピクセルをクリップします。これは、オブジェクトのこの部分にシャドウをキャストしないことと同じです。

(クリップの後、彼の後ろにあるものが影にあるかどうかを検出すると、影マップで現在の方向の光に最も近いことがわかるため、それらが直接照らされている場合、影が減衰し、前面は彼女のキャスト シャドウを見なくなります)

端的に言えば、大きな黒板を用意して、穴を掘って、穴を掘った後、現在のオブジェクトの背後にあるオブジェクトに貼り付ける、これが影です。

上部の影を実現する方法は、現在のオブジェクトを透明にした後、現在のオブジェクトの輪郭に従って黒板に穴を掘ることです。

ただし、上記の穴掘り方法は 2 値的なものであり、透明なオブジェクトの影を反映することはできません。つまり、明るい影と暗い影の区別もあります。

ただ、穴を掘るということ自体は二値的なもので、明暗の区別の仕方、実はここでは部分的な影が使われています。

つまり、ボード上に非常に小さな穴を掘り、その穴の密度を制御して、表示される最終的な影の効果が、明暗の異なるその種の影になるようにします。

ここでは、パネルの設定に従って使用するモードを決定する必要があるため、さらに 2 つのマクロを追加して判断する必要があります。

フェード モードと半透明モードを使用する場合、ここでも UV が必要になるため、上記のように UV マクロの定義を変更します。

半透明のオブジェクトの影の場合、ソフト シャドウと少し似ています。つまり、影の部分は確かにブロックされていますが、光から完全に保護されているわけではありません。

これは、光を受けるが完全に点灯しない、遮蔽するが完全に遮蔽しないという効果です。そのため、実際に点光源で半透明の物体を照射しても、影は比較的柔らかいものになります。

前に言った掘削によると、この効果は決して達成されません。

 表面が光の半分を通過させる場合

そこで、彼は上記の方法を巧みに利用して、光を半分だけ通過させました。ここでいう市松模様は、黒と白を 1 つずつ参照する必要があるため、光を半分だけ通過させます。

黒と白が非常に小さい場合は、限界を考慮してください。黒が白に近い場合、表面上の任意の点に相当し、光の一部を受け取り、半分を通過し、残りの半分を通過します。それ自体が受け入れられます。

さらに

より多くのパターンを選択し、黒と白の比率を変更してから、複数のパターンを組み合わせて、最終的に影を変えることができます.

つまり、異なる明るさの影です。

次に、Unity がディザ パターンを提供します。

彼は 1 から 16 まであることがわかります。

では、これをどのようにサンプリングすればよいのでしょうか? まず第一に、私たちの目的に従って、どのレベルをサンプリングするかについては話さないようにしましょう。

光の方向では、ディザ パターンのフォーマットに応じて光透過と不透明を実行します。

物体の表面ではなく、光の方向にあることに注意してください. 理解するための例を次に示します. 白黒のパターンを 1 対 1 で選択するとします。

必要なのは、光の半分がオブジェクトを通過し、反射と吸収の半分がオブジェクトの表面を通過することです。

使用するモデルが表面に凹凸のある小さな人物である場合、オブジェクトの表面の UV を使用してサンプリングすると、半分が透過するという保証はありません。

耳、鼻、コブなど、状況はもっと極端ですよね? 偶然にも、それらの突起と窪みは黒で覆われており、コブの間の移行側には白が配置されています。

次に、光を透過すると、透過する光の量は、光の方向に垂直な白いブロックの面積が半分であるかどうかに依存するため、半分以下になります。

したがって、このようなサンプリングは確実に機能しません。では、光に垂直な座標サンプリングは何ですか? そうです、画面座標です。これはシャドウ マップなので、ライトはカメラの位置にあります。

したがって、光の方向はスクリーン座標の平面に対して垂直です。したがって、スクリーン座標に従ってサンプリングする場合、つまり、この白黒画像をライトに垂直に直接貼り付けます。それは確かに保証します

光透過率は半分です。

したがって、この画面座標がここで使用され、VPOS を介して取得できます。

この画面座標では、いくつかの問題が発生する可能性があります。

ここでの意味は、インターポレーターで両方を記述することです。一部のプラットフォームでは競合が発生する可能性があり、値を割り当てるときに問題が発生する可能性があります。

また、頂点出力の位置は出力する必要がありますが、フラグメントの入力である必要はありません。

したがって、vert 出力と frag 入力を 2 つの構造体に分離できます。

vert 出力の場合は位置を含めますが、frag 入力の場合、この位置は必要ないため、直接削除してから VPOS を使用します。

Frag入力構造にVPOSのみが存在し、競合が発生しないように、それを彼に追加します。

スクリーン座標とUV座標、前者は最初にスクリーン上に物をレンダリングしてからスクリーンにマッピングし、オブジェクトのシルエットの一部だけを取り、後者は最初にUVを展開する方法でオブジェクトにテクスチャを貼り付けます、そしてそれを画面に表示します

(ただし、ここでのスクリーン座標の使用は、テクスチャのためではなく、穴を掘るためのものであり、これも同様です。)

ディザリングをサンプリングする場合、画面座標の前の係数が小さいほど、画面が小さくなり、サンプリング解像度が小さくなり、サンプリングされた黒点が大きくなります。無限にタイル張りされたテクスチャを考えてみてください。次に、画面サイズのフレームを使用して、テクスチャの範囲をフレーム化する係数でスケーリングします。次に、画面上の対応する場所のテクスチャ結果があります

トップはヴェール

以下はフラグです

ブラックボックスによると、Position (vert で出力される位置) の方が上にある理由は、すべて #if で判断されるため、3 つのいずれにも当てはまらない可能性があり、その際に何らかの問題が発生する可能性があります。

 

したがって、問題を回避できるように、その位置にelseを追加すると、彼とVPOSは相互に排他的であり、ここで競合は発生せず、まったく問題はありません.

使用に関しては、Unity を使用したいディザには sampler3D が必要であり、名前が決定されます。

次に、使用される座標の最初の 2 つの次元は画面座標であり、3 番目の次元はレベルです。

戻り値が 0 の場合は、サンプルがくり抜かれる場所に到達したことを意味します。クリップするだけ。

もう 1 つの問題は、画面座標が数千になることが多く、サンプリングのテクスチャ幅が 1 であることです。つまり、数千のタイルが必要であり、密度が高すぎる可能性があるため、係数を調整できます。

矢印で示したパターンのはずですが、パターンが何千回もタイル化されているため、両者の間にはあまり関連性がありません。

では、座標画面はサンプリング用であり、左の四角が右の四角に対応しているという意味ではありません。

ここでアルファを考慮して、彼にパターンを変更してもらいます.アルファが大きいほど、パターンが大きくなるはずです.つまり、光が透過しなくなります.

上記の結果を得ることができます.明らかに、私たちが掘った穴は大きすぎて、影の効果は明ら​​かではないので、ここで係数を変更することができます:

次に、ここに 2 つの問題があります。1 つは解像度です。制限のケース、つまり、掘る穴が無限にあると言いましたが、実際には、掘る穴のほとんどは画面のピクセル数です。

したがって、ここでの最終的な効果は解像度によって制限されます。

その後、フィルターを追加すると、効果がよりリアルになります。

最後に、動的な状況での影は非常に悪く、水泳効果は非常に深刻であり、この半透明のオブジェクトは非常に深刻であることが議論されています。

Unity では影を使用できません。

半透明+光源 ソフトシャドウ、ハードシャドウ、カットアウト+ハードシャドウ

実際、半透明の影のいくつかの制限を考慮すると、半透明のオブジェクトが半透明の影を放棄し、カットアウト シャドウを選択する場合があります。

これを実現するために、パネル上でスイッチを開くことができます。

ここでのスイッチはキーワードに対応し、キーワードに従って以前のロジックにいくつかの調整が行われます。

ここで半透明に対応していない場面で切り抜きを使いたいのですが、切り抜きのクリップ判定の前に or 条件を書くのもひとつの方法です。

または、カットアウトに対応するマクロを直接定義します。(この質問で使用される方法。)

主なことは、スイッチがスイッチを表示するために使用する関数を定義することです. このスイッチの表示は半透明の状態でなければなりません.

それから

上映前後の準備・片付け。

今回はカットアウトを表示する必要があります。

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

レンダリング 13

1つ目は、以前に触れた遅延レンダリングの設定で、主にグラフィックの設定を通じて、カメラごとに、グラフィック設定で結果セットを使用することを選択できます。

特定のモードでグラフィック設定の設定を直接上書きすることもできます。

ここで深度マップが生成されると、動的なバッチ処理が行われます。

2 つのライトのドロー コールが異なります。これは簡単に説明できます。なぜなら、ライトの位置が異なり、2 つのライトによって照らされるオブジェクトの数も異なるからです。ライトの視点からは、一部のオクルージョンが存在する可能性があります。 .

 

遅延レンダリングをオンにすると、MSAA はサブピクセルに基づいているためオフになります。遅延レンダリングではそれが再生されないため、アンチエイリアシングが必要な場合は、いくつかの後処理方法を見つける必要があります。

Gbuffer のドローコールを除いて、他のほとんどは影にあります。

まずフォワード レンダリングを見てください。何が行われたかというと、多くの繰り返し操作があることがわかります。

次に、再利用されたデータをキャッシュすることを検討すると、多くの計算を節約できます。

実際、ライティング計算でライト自体を除くすべてのピクセルがキャッシュされておらず、それ以外はすべてキャッシュされていることがわかりました。

したがって、最初のパスではライティング計算を直接実行せず、データを Gbuffer に書き込むためだけに使用します。

したがって、ディファード シェーディング

遅延レンダリング - Zhihu (zhihu.com)

実は、改良の核心はフォワードレンダリングで、光源が複数ある場合、光源の範囲が狭くなるため(光源が複数ある場合、平行光が少なく、ほとんどは点光源とスポット ライトです) は大きくありませんが、カメラで見たシーン全体を横断するため、多数の無効な計算が発生します。

この点を解決するディファード レンダリングの核心は、シーン オブジェクトのライトの計算をスクリーン ピクセルの計算に移すことです。多数の無効な計算が削減されます。

ここでは、それらは個別にレンダリングされると言われています。render は、ジオメトリ データ、さまざまな変換からの補間を参照し、Gbuffer に格納されます。これにより、基本的にジオメトリ レンダリング タスクが完了します。

そして、以下は照明の仕事です。

ここでの遅延レンダリングは、この場所を分離することです。ジオメトリの計算が最初に実行され、次に保存され、次に照明の計算が実行されます。

したがって、ここでレンダリングされるライトは遅延レンダリングであり、ピクセル ライトです。

複数の光源下でのそれらの違い。

実際には、ジオメトリをレンダリングした後、モデリング ソフトウェアでモデルのスクリーンショットを取得することと同じです. 最初はモデリング ソフトウェアで、色が付けられていないため、色は問題なく、次にスクリーンショットです。ジオメトリが処理され、基本的にすべての投影などを行ったので、すでに 2D になっています。

平行光に関しては、これはシーン全体を照らすので、計算するときはすべてのピクセルを直接計算します。

スポットライトに関しては、範囲を照らすことができると計算されています. もちろん、この種の光はブロックされる可能性があるため、カウントしないでください.

ポイント ライトとスポット ライトは似ています。

もちろん、不要なフラグメント計算を減らすために、ここでは Internal-StencilWrite が使用されていますが、それが何のためにあるのかはわかりません。

また、ここではスポットライトや点光源を使ってフラグメントの一部を計算していると言われていますが、実際にはレンダリング済みのジオメトリとその奥行き情報から判断できますが、ここには多くの問題があります。具体的な詳細はどのように実装されている必要がありますか? ?

一般的な考え方は、バウンディング ボックスを見つけ、バウンディング ボックスを投影して、投影がどのピクセルに当たるかを確認し、これらのピクセルに対して照明計算を実行することです。

レンダリング中、彼は色が反転します。

わかった気がしない

ジオメトリ レンダリング後の情報は Gbuffer に格納されます。

形式に違いがあります。

表示モードを変更することで、Gbuffer に保存されているデータを確認できます。

Gbuffer のコンテンツであるこの MRT もあります。

次の表示モードを使用する場合、それは法線を表示するモードです。

このモードは遅延レンダリングであるため、現在のモードでは遅延レンダリング オブジェクトのみが表示されます。

遅延レンダリングのパスについては、基本的なフォーマットは以前と同様で、上記の強調表示された部分を変更する必要があります。

上記の修正方法だけでは正しい結果が得られないので、正しい場合は、ジオメトリ データを遅延パスの出力結果に書き込む必要があります。

シェーディングされた結果を出力する代わりに。

実際の出力は次のとおりです: 4 バッファー. ここでは、シェーディング結果を直接出力します。これは、最初のバッファーのみを埋めることと同じです。

上記の結果が表示されます。

まず、奥行の関係で背後にあるものが切り取られ、オブジェクト自体が何らかの理由で描画されない可能性があるため、最後のステップでレンダリングされたスカイ ボックスが表示されます。

もちろん、私はこれをよく理解していませんよね?

まず出力する必要があるものを見てみましょう.ここでは状況が異なるため、出力結果をカプセル化し、レンダリングモードに応じてメンバーが持つものを内部的に定義する必要があります.

大文字の問題。

これらの gbuffer を埋めるとき:

最初の 2 つのチャネルは比較的単純で、いくつかの表面的な属性のみです。

3 つ目は属性を格納するために使用されます.違いは、A チャネルが 2 ビットのみで、他の RGB チャネルがすべて 10 ビットであるため、精度が高く、A が使用されないことです.

ここの最後のバッファは、シーンの照明の結果を蓄積するために使用されます。これは、前のカラー バッファ/と同等です。

ここで実行される計算の結果は、そこに蓄積されます。そして、累積しないもの、つまり自己照明があるので、このパスに自己照明の結果を追加する必要があります。

そうして初めて、最終結果が完成します。

もちろん、それは完全で完全でなければなりません. この環境光もここで必要です. ここで遅延レンダリングの間接光の計算を開くだけです. 最終的には、gbuffer3 の結果で間接光を使用します.

含まれています。

あとはそれぞれの光そのものの計算結果で、その積み重ねが最終的な実際の効果です。

最後に、カメラのモードを LDR に変更します。

HDRをオフに変更するだけです。

すると、とんでもない間違いであることが判明しました。

その理由は、このデータには特定のデコード方法があり、モードを変更しただけで、対応するデコード方法を変更しなかったため、とんでもない結果になりました。

!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!

遅延レンダリング反射の話題、反射忘れてて読んでなかった!一緒にチェックして見直しましょう!! ! ! ! ! ! ! ! ! ! ! ! ! !

おすすめ

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