夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityで常に最前面に描画されるシェーダーを書く ZTestについて

本日はUnityShader学習枠です。

Unityでは基本的に現実世界同様手前にあるオブジェクトが奥にあるオブジェクトを塗りつぶすように描画されています。

しかし場合によっては奥にあるオブジェクトが一番手前に描画されてほしいというときもあります。

今回はいくつか最前面に描画されるシェーダーを紹介します。

〇最前面に描画されるシェーダー

 今回は3つのキューブが重なっているように見えるこちらの画像の一番奥の白いキューブを例に紹介します。

〇描画順として最前面に描画されるシェーダー

今回紹介する方法はZtest Alwaysを使用する方法です。 ZTestとは、Z軸(奥行)=デプスをほかのオブジェクトと比較して塗りつぶすか塗りつぶさないかを決める値です。

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        ZTest Always //追加
        
        Pass
        {
            CGPROGRAM
    ・・・

通常はほかのオブジェクトのピクセルと深度を比較するZTestに合格した場合に初めて描画されますが、ZTest Alwaysを指定することで常にオブジェクトが描画されるようになります。

ただしこの場合描画順に使用されるレンダーキューの値によってはほかのオブジェクトが最前面に描画されてしまいます。

 次の画像では下のオブジェクトが先に描画されてしまっています。

 一般的にレンダーキューによって描画順が変わるのはOpaque(不透明)オブジェクトでは起こらずTransparentオブジェクトで有効ですが、ZTest Alwaysを定義している場合はレンダーキューの影響を受け、レンダーキューの値が大きいオブジェクトが先に描画されます。

 またレンダーキューが3000番台のTransparent(透明)な描画の場合は同じレンダーキューの場合はOpaqueの時とは逆に2000番台のOpaqueのオブジェクトよりも手前に描画されますが、3000番台のオブジェクトとは距離関係によって描画が決定されます。

この場合は最前面に描画したいシェーダーのレンダーキューを3001など大きくします。

これによって常に最前面に描画されるようになりました。

  このようにZTest Alwaysを使用することで描画順に関して扱うことができました。

本日は以上です。