1. 程式人生 > >【Shader】黑白灰深度圖渲染

【Shader】黑白灰深度圖渲染


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 } } }