Unity中BRP下的深度图

文章目录

  • 前言
  • 一、在Shader中使用
    • 1、在使用深度图前申明
    • 2、在片元着色器中
  • 二、在C#脚本中开启摄像机深度图
  • 三、最终效果


前言

在之前的文章中,我们实现了URP下的深度图使用。

  • Unity中URP下使用屏幕坐标采样深度图

在这篇文章中,我们来看一下BRP下深度图怎么单独使用。


一、在Shader中使用

1、在使用深度图前申明

sampler2D _CameraDepthTexture;

2、在片元着色器中

float2 uv = i.positionCS/ _ScreenParams.xy;
float4 cameraDepthTex = tex2D(_CameraDepthTexture,uv);
float depthTex = LinearEyeDepth(cameraDepthTex);
return frac(depthTex);


二、在C#脚本中开启摄像机深度图

Camera.main.depthTextureMode = DepthTextureMode.Depth;


三、最终效果

Shader "MyShader/URP/P4_1"
{
    Properties 
    {
        _Color("Color",Color) = (0,0,0,0)
        _MainTex("MainTex",2D) = "white"{}
    }
    
    SubShader
    {
        Tags
        {
            //渲染类型
            "RenderType"="Transparent"
            //渲染队列
            "Queue"="Transparent"
        }
        //Blend One One
        ZWrite Off
        Pass
        {
           
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // Pragmas
            #pragma target 2.0
            
            // Includes
            #include "UnityCG.cginc"
            
           
            half4 _Color;
            sampler2D _MainTex;float4 _MainTex_ST;
            sampler2D _CameraDepthTexture;
            
            
            struct appdata
            {
                float3 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };
            
            struct v2f
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
                float4 screenPos : TEXCOORD1;
            };
          
            v2f vert(appdata v)
            {
                v2f o;
                o.positionCS = UnityObjectToClipPos(v.positionOS);
                o.uv = TRANSFORM_TEX(v.uv,_MainTex);
                o.screenPos = ComputeScreenPos(o.positionCS);
                return o;
            }
            //fixed4 frag(v2f i) : SV_TARGET
            //片元着色器
            half4 frag(v2f i) : SV_TARGET
            {
                half4 c;
                
                float4 mainTex = tex2D(_MainTex,i.uv);
                //c = _Color *  mainTex;
                //深度图
                //float2 uv = i.screenPos.xy / i.screenPos.w;
                float2 uv = i.positionCS/ _ScreenParams.xy;
                float4 cameraDepthTex = tex2D(_CameraDepthTexture,uv);
                float depthTex = LinearEyeDepth(cameraDepthTex);
                return frac(depthTex);
            }
            ENDCG
        }
    }
}

你可能感兴趣的:(Unity,unity,游戏引擎)