本文是视频课程《Unity技术美术TA:Shader篇》,算是对自己学习的总结,也希望分享下所学知识~~
深度图的作用:
渲染深度图
相交高亮
能量场
全局雾效
扫描线
水淹
垂直雾效
边缘检测
运动模糊
景深
如何查看深度图?
1.需要开启 Depth Texture
2.FrameDebuger 可以看到 有个 CopyDepth
注意:
a.半透明物体没有深度图(RenderQueue>2500)
b.如果都选了 Lighting/Cast Shadows 会由阴影部分生成深度图
优化点:
BuildIn 管线 需要每个物体都用 ShaderCaster 的Pass
URP 管线只需要一个Pass
如何在 Shader 里面获取深度图
代码如下:
Shader "Custom/TA_URP/DepthViewer"
{
Properties {}
SubShader
{
Tags
{
"RenderPipeline"="UniversalPipeline"
"RenderType"="Opaque"
"Queue"="Geometry"
}
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
struct Attributes
{
float3 positionOS : POSITION;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float4 screenPos : TEXCOORD0;
};
CBUFFER_START(UnityPerMaterial)
float4 _CameraDepthTexture_ST;
CBUFFER_END
#define smp _Linear_Clamp
SAMPLER(smp);
// 定义贴图 _CameraDepthTexture
TEXTURE2D(_CameraDepthTexture);
Varyings vert(Attributes v)
{
Varyings o;
o.positionCS = TransformObjectToHClip(v.positionOS);
//屏幕空间的齐次坐标
o.screenPos = ComputeScreenPos(o.positionCS);
return o;
}
half4 frag(Varyings i) : SV_Target
{
//计算屏幕空间的UV(去齐次)
float2 screenUV = i.screenPos.xy / i.screenPos.w;
//深度图的颜色值非线性的,需要转换成0-1 线性的
half4 depthTex = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, smp, screenUV);
//有两组值,根据revert-z,最后都为了推到用
//_ZBufferParams
//返回0-1之间的值
float depth = Linear01Depth(depthTex, _ZBufferParams);
//观察空间的 z值(大于1的)
// float depth = LinearEyeDepth(depthTex, _ZBufferParams);
return depth;
}
ENDHLSL
}
}
FallBack "Hidden/Shader Graph/FallbackError"
}
如图所示,输出深度图信息: