文章目录
- 效果
- shader部分
- C# 部分
- 理解
- 参考
效果
shader部分
Shader "Example/DepthTexture"
{
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _CameraDepthTexture;
struct a2v
{
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
v2f vert (a2v i)
{
v2f o;
o.pos = UnityObjectToClipPos(i.pos);
o.uv = i.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);
depth = Linear01Depth(depth);
return fixed4(depth, depth, depth, 1);
}
ENDCG
}
}
FallBack "Diffuse"
}
C# 部分
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DepthTexture : MonoBehaviour
{
public Shader depthTextureShader;
private Material depthTextureMaterial = null;
public Material material
{
get
{
depthTextureMaterial = new Material(depthTextureShader);
return depthTextureMaterial;
}
}
void OnEnable()
{
Camera cam = GetComponent<Camera>();
cam.depthTextureMode |= DepthTextureMode.Depth;
}
void OnDisable()
{
Camera cam = GetComponent<Camera>();
cam.depthTextureMode &= ~DepthTextureMode.Depth;
}
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
if (material != null)
{
Graphics.Blit(src, dest, material);
}
else
{
Graphics.Blit(src, dest);
}
}
}
理解
在Unity中,通过摄像机生成一个深度纹理,属于后处理,获取深度纹理通过在C#中cam.depthTextureMode = DepthTextureMode.Depth;
实现。在Shader中,通过_CameraDepthTexture
访问深度纹理,然后再使用SAMPLE_DEPTH_TEXTURE
用当前像素的纹理坐标对深度纹理进行采样。Linear01Depth(i)
通过深度纹理 i 给出高精度值时,返回相应的线性深度,范围在 0 到 1 之间。C#脚本需要挂在相机上。
参考
Unity 内置宏
《Unity Shader入门精要》