文章目录
- 效果
- 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入门精要》