【Shader】黑白灰深度圖渲染
阿新 • • 發佈:2019-01-05
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
}
}
}