Unity 瑣碎(2): Shader 顏色調試

Shader的調試有點蛋疼,最近在測試Image Effect中深度還原時,不知道輸出的結論是否正確,後面就採起了這種策略。在物體上世界座標位轉換區間到[0,1],而後做爲顏色進行輸出。而後Image Effect shader中也採用相似的方式進行輸出,經過顏色進行比較。須要注意的是:顏色區間,好比將世界座標轉換到顏色空間,能夠按法線的方式先歸一化轉換到[-1,1],再轉換到[0,1]。git

相似的作法能夠參考《Shader入門》第五章,shader源碼,而且提供了一個工具,用於顏色抓取github

Shader "Unlit/ObjectTestColor"
{
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque" 
        }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex object_vert
            #pragma fragment object_frag
        
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float4 clippos : TEXCOORD0;  
                float4 worldPos : TEXCOORD1;  
                float4 depth : TEXCOORD2;  
            };
            
            v2f object_vert (appdata v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.clippos = o.vertex ;
                o.depth.x = COMPUTE_DEPTH_01;
                o.worldPos =  mul(_Object2World, v.vertex);
                return o;
            }
            
            fixed4 object_frag (v2f i) : SV_Target
            {
                //NDC深度
                //fixed4 ndc = i.clippos / i.clippos.w ;
                //float d = ndc * 0.5 + 0.5 ;
                //return fixed4(d,d,d,1);

                //View空間深度
                //float viewdDepth = i.depth.x * 10;
                //return fixed4(viewdDepth,viewdDepth,viewdDepth,1)   ;

                //世界座標
                float dis = length(i.worldPos.xyz);
                float3 worldPos2 = i.worldPos.xyz/dis;
                worldPos2 = worldPos2 * 0.5 + 0.5;
                return fixed4(worldPos2,1);
            }
            ENDCG
        }
    }

    FallBack "Diffuse"
}
相關文章
相關標籤/搜索