Efecto de objeto de oclusión de escaneo holográfico terrestre de UnityShader (espacio de pantalla)


Hace algún tiempo, cuando jugué "Call of Duty 11", descubrí que se agregó una granada de escaneo de muy alta tecnología, que puede generar un círculo de escaneo similar a un efecto holográfico, y mostrar a los enemigos detrás de la pared, similar a esto:

 

Recientemente, planeo lograr un efecto similar en tercera persona, de la siguiente manera:

Plan de IMPLEMENTACION:

1. Calcule las coordenadas mundiales de los píxeles del espacio de la pantalla de acuerdo con _CameraDepthTexture

2. Pase las coordenadas mundiales de la posición de inicio del escaneo al sombreador

3. Calcule la distancia desde las coordenadas mundiales del espacio de la pantalla hasta las coordenadas mundiales de la posición de inicio del escaneo

4. Renderice el área de escaneo de acuerdo con los parámetros relevantes


1. La información de profundidad del espacio de proyección se registra en _CameraDepthTexture, y las coordenadas mundiales se pueden obtener mediante los siguientes métodos:

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. Calcule la distancia entre la posición inicial entrante y las coordenadas del mundo del espacio de la pantalla:

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;

Finalmente, se puede obtener el siguiente efecto:

 
3. Guarde el resultado de renderizado del paso anterior y use CommandBuffer para renderizar el objetivo (como el enemigo) que debe marcarse como visualización continua en esta textura. Tenga en cuenta que es necesario juzgar si el objetivo está en la cámara. El efecto es el siguiente:

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. Rasterice la pantalla uv de acuerdo con la información de la pantalla uv y calcule el valor de color muestreado en cada cuadrícula, se pueden obtener los siguientes resultados:

 

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. También en función del resultado de la cuadrícula de ahora, se puede calcular el uv de cada cuadrícula pequeña, y la textura utilizada como efecto de escaneo holográfico se muestrea de acuerdo con el uv, y se obtienen los siguientes resultados:

 


6. Superponga el resultado final:

 


————————————————
Enlace original: https://blog.csdn.net/mobilebbki399/article/details/78379758

Supongo que te gusta

Origin blog.csdn.net/weixin_42565127/article/details/130326101
Recomendado
Clasificación