贴花

//URP基础Shader Shader "Kino/MappingTex" { Properties { [Header(Blend)] [Enum(UnityEngine.Rendering.BlendMode)]_SrcFactor("SrcFactor",int) = 1 [Enum(UnityEngine.Rendering.BlendMode)]_DstFactor("DstFactor",int) = 1 _MainTex("MainTex",2D) = "white"{} _BaseColor("Base Color",color) = (1,1,1,1) } //URP SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True" "RenderPipeline" = "UniversalPipeline" }
Pass { Name "Unlit" Blend [_SrcFactor] [_DstFactor] HLSLPROGRAM // Required to compile gles 2.0 with standard srp library #pragma prefer_hlslcc gles #pragma exclude_renderers d3d11_9x #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog
#define REQUIRE_DEPTH_TEXTURE #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl" struct Attributes { float4 positionOS : POSITION; float2 uv : TEXCOORD0; };
struct Varyings { float4 positionCS : SV_POSITION; float2 uv : TEXCOORD0; float4 positionOS : TEXCOORD1; float3 positionVS : TEXCOORD2; float fogCoord : TEXCOORD3; };
CBUFFER_START(UnityPerMaterial) half4 _BaseColor; TEXTURE2D(_MainTex);float4 _MainTex_ST; CBUFFER_END #define smp _linear_clamp SAMPLER(smp);
Varyings vert(Attributes v) { Varyings o = (Varyings)0; o.positionOS = v.positionOS + 0.5; o.positionCS = TransformObjectToHClip(v.positionOS); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.positionVS = TransformWorldToView(TransformObjectToWorld(v.positionOS)); o.fogCoord = ComputeFogFactor(o.positionCS.z); return o; }
half4 frag(Varyings i) : SV_Target { half4 c; float2 screenUV = i.positionCS.xy / _ScreenParams.xy;
//根据当前图片再屏幕坐标下的深度图的观察空间的值 构建观察空间(深度重建观察空间) //思路: //1)通过深度图求出像素所在的观察空间的z值 //2)通过当前渲染的画面求出当前片元再观察空间的坐标XYZ值 //3)通过 1)2)计算出 深度图中的像素的观察空间坐标XYZ值 //4)将深度图的观察空间坐标 转换 到模型的本地空间 再采样xy值 float depth = SampleSceneDepth(screenUV); depth = LinearEyeDepth(depth, _ZBufferParams);
//构建深度图再观察空间的坐标 float4 depthVS = 1; depthVS.xy = i.positionVS.xy * depth / -i.positionVS.z; depthVS.z = depth; float3 positionWS = mul(unity_CameraToWorld, depthVS); float3 positionOS = mul(unity_WorldToObject, float4(positionWS, 1)); //把本地坐标[-0.5,0.5]变换到Uv采样的[0,1] float2 depthUv = positionOS.xz + 0.5;
//贴图采样 half4 baseMap = SAMPLE_TEXTURE2D(_MainTex, smp, depthUv); c = baseMap * _BaseColor;
//雾效 half fog = saturate(lerp(1, 0, i.fogCoord)); c *= fog; return baseMap; } ENDHLSL } }
//BuildIn SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" "IgnoreProjector" = "True" }
Pass { Name "Unlit" Blend [_SrcFactor] [_DstFactor] CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct Attributes { float4 positionOS : POSITION; float2 uv : TEXCOORD0; };
struct Varyings { float4 positionCS : SV_POSITION; float2 uv : TEXCOORD0; float4 positionOS : TEXCOORD1; float3 positionVS : TEXCOORD2; };
half4 _BaseColor; sampler2D _CameraDepthTexture; sampler2D _MainTex; float4 _MainTex_ST;
Varyings vert(Attributes v) { Varyings o = (Varyings)0; o.positionOS = v.positionOS + 0.5; o.positionCS = UnityObjectToClipPos(v.positionOS); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.positionVS = float4(UnityObjectToViewPos(v.positionOS), 1); return o; }
half4 frag(Varyings i) : SV_Target { half4 c = 0; float2 screenUV = i.positionCS.xy / _ScreenParams.xy; float depth = tex2D(_CameraDepthTexture, screenUV).r; depth = LinearEyeDepth(depth);
//构建深度图再观察空间的坐标 float4 depthVS = 1; depthVS.xy = i.positionVS.xy * depth / -i.positionVS.z; depthVS.z = depth; float3 positionWS = mul(unity_CameraToWorld, depthVS); float3 positionOS = mul(unity_WorldToObject, float4(positionWS, 1)); //把本地坐标[-0.5,0.5]变换到Uv采样的[0,1] float2 depthUv = saturate(positionOS.xz + 0.5);
//贴图采样 float4 baseMap = tex2D(_MainTex, depthUv); c = baseMap * _BaseColor; return c; } ENDCG } } }