Unity のいくつかのメカニズム

作動中のメカニズム

新しい 3D オブジェクトを作成します。ビルトイン シェーダを使用する場合、そのマテリアルはアセットに表示されません。ビルトイン シェーダ自体は変更できません。テクスチャを使用して 3D オブジェクトに配置すると、unity が自動的に作成します。 The material という名前のテクスチャ (オブジェクトのマテリアルが必要なため、デフォルトを変更する場合は、当然マテリアルが必要になります)

レンダリング キュー

https://blog.csdn.net/sinat_25415095/article/details/123752904

レンダー キューと深度バッファーは同じものではないことに注意してください。

レンダリング キューは Unity 固有の、シェーダーの実行順序を決定するメカニズムであり、
深度バッファーは、シェーダーの実行順序がオクルージョン関係に影響を与えないようにするメカニズムです。

オブジェクトは小さいものから大きいものまでレンダリング キューに従ってレンダリングされます。すべての不透明なオブジェクトがレンダリングされた後にレンダリングされる
など、特定のレンダリング キューがオブジェクトに設定されている場合
Tags {"Queue"="Geometry+1"}

同じレンダリング キュー内のオブジェクトには、特定のレンダリング順序があります。
不透明なオブジェクト: カメラから前から後ろまでの距離
(GPU の EarlyZ テクノロジの存在により、オーバー ドローを減らすことができます)
半透明のオブジェクト: カメラから後ろから前までの距離(半透明のオブジェクトは深さの書き込みで閉じられます。これにより、ブレンド時に色が正しいことが保証されます)

(カメラからの距離の測定方法は一時的に不明です。オブジェクトの原点であるか、オブジェクトの最も遠い/最も近い頂点である可能性があります)

初期のZ



シェーダーが動作するメカニズム

頂点ごと、ピクセルごと

まず、標準シェーダーの場合、1 ピクセルに対して実行される完全なシェーダーではなく、
頂点シェーダーが頂点ごとに実行された後、フラグメント シェーダーがフラグメントごとに実行されます。

テクスチャ座標が頂点で使用されている場合

明らかに、頂点ごとに計算する場合、テクスチャ座標はこの頂点の座標にのみ対応し、オブジェクト全体をカバーすることはできません (テクスチャ座標計算がフラグメント シェーダで使用されていない場合)。 : 頂点のテクスチャ座標は、すべてのフラグメントにマップされた、オブジェクトのフラグメント部分の線形補間全体になり
ます

後処理とテンプレートのテスト

ステンシル テストは後処理では使用できません. 使用すると失敗します. これは後処理が仮想レンダリング テクスチャで実行され、このレンダリング テクスチャが画面空間の各バッファを継承しないためです (不明,しかし、そうすべきです)

RenderTexture.GetTemporary(rtW, rtH,24); 3 番目のパラメーターを 24 に変更すると深度ステンシル バッファーが保持され、テストが無効になることが公式の API ドキュメントに記載されています。


別のステートメントを追加することを紹介する記事

RenderTexture buffer = RenderTexture.GetTemporary(rtW, rtH,24); 
Graphics.SetRenderTarget(buffer.colorBuffer, src.depthBuffer);

これによりバッファは保持されますが、テストは依然として無効です

これまでのところ、後処理でステンシル バッファを使用する方法は見つかっていません. SSSSS の場合、マスキングが考慮され、解決策は
後で更新されます.

参考のため


テクスチャ座標のプラットフォーム微分

まず、DirectX と OpenGL の UV 座標が一致していないことを知っています:
ここに画像の説明を挿入
Unity は OpenGL の座標系を使用します; DirectX プラットフォームの場合、Unity は座標を自動的に変換し、通常はテクスチャの違いを考慮する必要はありません。プラットフォームの座標。

ただし、1 つの例外:アンチエイリアシングを有効にする && 1 つの ImageEffect で 2 つ以上の RenderTex を使用する

理由(憶測):

  • アンチエイリアシングも一種の画面後処理であり、ガウスぼかし、ブルーム、その他の BlurEffect に先行することはわかっています (ぼかし後のアンチエイリアシングは意味がありません)。
  • ただし、一般的なアンチエイリアシング アルゴリズムはハードウェアによって高速化されるため、UV 座標を移動できない必要があります.つまり、ハードウェア アンチエイリアシングがオンになっている場合、Unity は座標を変換しません.エラー,
  • 後処理で Unity が UV 座標を変換するステップは、**Graphics.Blit()** 関数に組み込まれています。つまり、この関数を呼び出すと、RenderTex が 1 つしか使用されていない場合、座標は自動的に変換されます。 、そうではありません 問題があります。2 つの RenderTex シートが必要な場合、2 つのシートの UV が反対になることがあります。
  • 「うまくいかないかもしれない」可能性としては、(1) ImageEffect よりもアンチエイリアスが早いかどうか (2) ハードウェアのアンチエイリアスかどうか

(上記は全て「UnityShader入門」5.6.1の記載に基づく個人的な推測です。真の理由は入手後、追って更新します)

解決:

	#if UNITY_UV_STARTS_AT_TOP  //检测是否DirectX
	if (_MainTex_TexelSize.y < 0.0) 
		uv.y = 1.0 - uv.y; //进行纵向翻转
	#endif

DirectX の場合、組み込みの _MainTex_TexelSize (テクセル サイズ) の計算方法と y 軸の反転により、テクセル サイズの y 値が 0 未満になります。

おすすめ

転載: blog.csdn.net/dogman_/article/details/129703644