1.パースペクティブミラー効果の例
。シーン内に、正方形、壁、球の3つのオブジェクトが作成されます。
次に、3つのシェーダーと3つの初期シェーダーが作成されます。3つのシェーダーを3つのシェーダーにドラッグして
、マテリアルを追加します。ボールを3つのオブジェクトにドラッグします。簡単に観察できるように、これらの3つのオブジェクトに赤、青、緑を付けます。
赤い正方形を遠近法の鏡として使用した場合の効果を
確認します。ゲームビュー:
領域を通してはっきりと見ることができます。赤い四角。壁越しに緑の球体が見えます。
2.効果の実現
遠近効果は、実際にはテンプレートテストによって実現されます。赤い四角をマスクとして使用し、同じテンプレート値を3つのシェーダーに追加してから、球をテンプレートテストに通します。
具体的な手順:作成した3つの初期シェーダーを開き、パスを見つけて、テンプレートテストを追加します
//cube.shader 红色方块
Pass
{
Stencil
{
Ref 2 //模板值给一个2,三个物体模板值都必须相同
Comp always//表示在模板测试中总是通过
Pass replace//作为遮罩物
}
//wall.shader 蓝色墙体
Pass
{
Stencil
{
Ref 2
Comp NotEqual//不通过模板测试
}
//sphere.shader 绿色球体
Pass
{
Stencil
{
Ref 2
Comp Equal//通过模板测试
}
次に、効果を見てみましょう。
赤い四角は見えますが、緑の球は見えません。これは、テンプレートテストでは、四角が常にCompを与え、球がCompEqualを与えるためです。どちらもテンプレートに合格します。テストすると、バッファに書き込まれ、カメラに近いオブジェクトのみが表示されます。
したがって、cube.shaderのパスにコードを追加する必要があります:ZWrite Off
Pass
{
Stencil
{
Ref 2 //模板值给一个2,三个物体模板值都必须相同
Comp always
Pass replace
}
ZWrite Off//不写入缓冲区
次に、効果を見てみましょう
。遠近効果が達成されました。
これにより、追加の問題が発生しました。
ゲームで球を直接見ると、見えません。
これは、テンプレートテストに合格した後、パースペクティブ範囲外のバッファーに書き込まれないためです。解決策は非常に単純です。つまり、パスコードをコピーするだけです。つまり、シェーダーに2つのパスがあります。コピーされたパスコードは、オブジェクトがゲーム内で直接観察できるように、内部のテストテンプレートコード(ステンシルコード)を削除する必要があります
3.
マスクテストの原理の簡単な説明マスクテストは、バッファを2つに分割することとして理解できます。1つはマスクオブジェクトが配置されている範囲で、もう1つはマスクオブジェクトの外側の範囲です。上記の2つの範囲例を図に示し
ます。さまざまな状況を表に要約します。次
の表
で、
マスクされたオブジェクトの範囲内のバッファーを一時的に呼び出します。内側のバッファーと、マスクされたオブジェクトの外側のバッファーを外側のバッファーとして呼び出します。
マスクとしてかどうか | マスクテストに合格するかどうか | 書き込みバッファの状況 |
---|---|---|
はい | はい | 内部バッファと外部バッファに書き込まれます |
はい | 番号 | 内部バッファに書き込みません、外部バッファに書き込みます |
番号 | はい | 外部バッファではなく、内部バッファに書き込みます |
番号 | 番号 | 内部バッファに書き込みません、外部バッファに書き込みます |
これらの原則を使用すると、単純な遠近効果を実現できます。X線と同様の半遠近効果を実現する場合は、レンダリングキューの制御を詳細に学習する必要があります。
この記事は以上です。どなたでもコメントをお待ちしております。