本文共 2022 字,大约阅读时间需要 6 分钟。
Shader "Custom/RenderDepthMapShader"{ Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" // 顶点着色器希望得到的数据类型通过关键字区分 struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; // 顶点着色器要传递给片段着色器的数据种类 struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; // 自定义纹理图片 sampler2D _MainTex; // 摄像机开启深度模式之后,深度信息自动传入该内置变量 // Camera.main.depthTextureMode = DepthTextureMode.Depth; // 渲染路径为:Deferred(否则图像会上下对称颠倒) sampler2D _CameraDepthTexture; // ST解释1:SamplerTexture(采样图) // ST解释2:是指纹理图片的缩放和偏移,S指Scale,T指Transform // 如果不定义采样图TRANSFORM_TEX()函数就无法正确使用 float4 _MainTex_ST; // 顶点着色器 v2f vert (appdata v) { // 定义一个结构体用于传递给片段着色器 v2f o; // 校正图像位置和大小 // 用顶点的UV图和材质球的图的tiling和offset做运算 // 确保材质球里的缩放和偏移量是正确的 o.uv = TRANSFORM_TEX(v.uv, _MainTex); // 转换对象坐标到屏幕像素坐标 // 等价于:mul(UNITY_MATRIX_MVP, v.vertex) o.vertex = UnityObjectToClipPos(v.vertex); return o; } // 片段着色器 fixed4 frag (v2f i) : SV_Target { // 深度信息保存在_CameraDepthTexture中 // 通过贴图的纹理来获取深度信息,使用UNITY_SAMPLE_DEPTH // tex2D 二维纹理查询,获取图的不同像素点的深度信息 float depth = UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, i.uv)); // 讲深度值变为[0,1]的线性深度 float linear01Depth = Linear01Depth(depth); return linear01Depth; } ENDCG } }}
转载地址:http://rbkii.baihongyu.com/