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"
}
相关文章
相关标签/搜索