贴花
//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
}
}
}