UnityShader グラウンド ホログラフィック スキャニング オクルージョン オブジェクト エフェクト (スクリーン スペース)


少し前に「Call of Duty 11」をプレイしたとき、非常にハイテクなスキャングレネードが追加されていることを発見しました。これは、ホログラフィック効果に似たスキャンサークルを生成し、壁の後ろの敵を表示することができます。これに:

 

最近、次のように、三人称で同様の効果を達成する予定です。

実行計画:

1. _CameraDepthTexture に従って、スクリーン スペース ピクセルのワールド座標を計算します。

2. スキャン開始位置のワールド座標をシェーダーに渡す

3. 画面空間のワールド座標からスキャン開始位置のワールド座標までの距離を計算する

4.関連するパラメータに従ってスキャン領域をレンダリングします


1. 投影空間の深度情報は _CameraDepthTexture に記録され、ワー​​ルド座標は次のメソッドで取得できます。

fixed depth = tex2D(_CameraDepthTexture, i.uv).r;
fixed4 projPos = fixed4(i.uv.x * 2 - 1, i.uv.y * 2 - 1, -depth * 2 + 1, 1);
worldPos = mul(internalCameraToWorld, worldPos);
worldPos /= worldPos.w;

2. 入力された初期位置とスクリーン スペースのワールド座標の間の距離を計算します。

fixed dis = length(internalCentPos.xyz - worldPos.xyz);
 
fixed a = 1 - saturate((abs(dis - internalArg.x) - internalArg.y) / internalArg.z);
a = a * internalFade.x + c * internalFade.y;

最後に、次の効果が得られます。

 
3. 前ステップのレンダリング結果を保存し、CommandBuffer を使用して、連続表示としてマークする必要があるターゲット (敵など) をこのテクスチャにレンダリングします (ターゲットがカメラ内にあるかどうかを判断する必要があることに注意してください)。効果は次のとおりです。

public static void CallRender(Vector3 worldPosition, Renderer[] renderer)
    {
        if (!IsInitialized())
            return;
        if (instance.m_IsShowingEffect)
        {
            if (renderer == null)
                return;
            Vector3 pjpos = instance.m_Camera.worldToCameraMatrix.MultiplyPoint(worldPosition);
            pjpos = instance.m_Camera.projectionMatrix.MultiplyPoint(pjpos);
            if (pjpos.x < -1 || pjpos.x > 1 || pjpos.y < -1 || pjpos.y > 1 || pjpos.z < -1 || pjpos.z > 1)
                return;
            for (int i = 0; i < renderer.Length; i++)
            {
                instance.m_CommandBuffer.DrawRenderer(renderer[i], instance.m_ReplaceMaterial);
            }
        }
    }

 

4. スクリーン uv 情報に従ってスクリーン uv をラスタライズし、各グリッドでサンプリングされたカラー値を計算すると、次の結果が得られます。

 

float2 fl = floor(i.uv * _EffectScale);
float dp = tex2D(_PreTex, (fl + float2(0.5, 0.5)) / _EffectScale);
                 
float4 led = tex2D(_EffectTex, i.uv * _EffectScale - fl);
                 
col.rgb += led.rgb*dp;

5. また、今のグリッドの結果に基づいて、各小さなグリッドの UV を計算できます。ホログラフィック スキャン効果として使用されるテクスチャは、UV に従ってサンプリングされ、次の結果が得られます。

 


6. 最終結果をオーバーレイします。

 


———————————————
オリジナルリンク: https://blog.csdn.net/mobilebbki399/article/details/78379758

おすすめ

転載: blog.csdn.net/weixin_42565127/article/details/130326101