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