Unity 琐碎(2): Shader 颜色调试

本文介绍了一种Shader调试策略,通过将物体的世界坐标转换为颜色空间输出,以便于比对ImageEffect中的深度还原效果。同时提供了Shader代码示例及颜色抓取工具。

Shader的调试有点蛋疼,最近在测试Image Effect中深度还原时,不知道输出的结论是否正确,后面就采取了这种策略。在物体上世界坐标位转换区间到[0,1],然后作为颜色进行输出。然后Image Effect shader中也采用类似的方式进行输出,通过颜色进行比较。需要注意的是:颜色区间,比如将世界坐标转换到颜色空间,可以按法线的方式先归一化转换到[-1,1],再转换到[0,1]。

类似的做法可以参考《Shader入门》第五章,shader源码,并且提供了一个工具,用于颜色抓取

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"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值