1+ // Description: https://forum.unity.com/threads/how-to-print-shaders-var-please.26052/#post-5160875
2+
3+ Shader "Debugger"
4+ {
5+ Properties
6+ {
7+ _MainTex ( "Texture" , 2D ) = "white" {}
8+ }
9+ SubShader
10+ {
11+ Cull Off
12+ Pass
13+ {
14+ CGPROGRAM
15+ #pragma vertex VSMain
16+ #pragma geometry GSMain
17+ #pragma fragment PSMain
18+ #pragma target 5.0
19+
20+ sampler2D _MainTex;
21+
22+ struct Data
23+ {
24+ float4 vertex : SV_Position ;
25+ float2 uv : TEXCOORD0 ;
26+ float number : VALUE;
27+ };
28+
29+ // "PrintValue" function by P.Malin
30+ float PrintValue ( float2 vCoords, float fValue, float fMaxDigits, float fDecimalPlaces )
31+ {
32+ if ((vCoords.y < 0.0 ) || (vCoords.y >= 1.0 )) return 0.0 ;
33+ bool bNeg = ( fValue < 0.0 );
34+ fValue = abs (fValue);
35+ float fBiggestIndex = max (floor (log2 (abs (fValue)) / log2 (10.0 )), 0.0 );
36+ float fDigitIndex = fMaxDigits - floor (vCoords.x);
37+ float fCharBin = 0.0 ;
38+ if (fDigitIndex > (-fDecimalPlaces - 1.01 ))
39+ {
40+ if (fDigitIndex > fBiggestIndex)
41+ {
42+ if ((bNeg) && (fDigitIndex < (fBiggestIndex+1.5 ))) fCharBin = 1792.0 ;
43+ }
44+ else
45+ {
46+ if (fDigitIndex == -1.0 )
47+ {
48+ if (fDecimalPlaces > 0.0 ) fCharBin = 2.0 ;
49+ }
50+ else
51+ {
52+ float fReducedRangeValue = fValue;
53+ if (fDigitIndex < 0.0 ) { fReducedRangeValue = frac ( fValue ); fDigitIndex += 1.0 ; }
54+ float fDigitValue = (abs (fReducedRangeValue / (pow (10.0 , fDigitIndex))));
55+ int x = int (floor (fDigitValue - 10.0 * floor (fDigitValue/10.0 )));
56+ fCharBin = x==0 ?480599.0 :x==1 ?139810.0 :x==2 ?476951.0 :x==3 ?476999.0 :x==4 ?350020.0 :x==5 ?464711.0 :x==6 ?464727.0 :x==7 ?476228.0 :x==8 ?481111.0 :x==9 ?481095.0 :0.0 ;
57+ }
58+ }
59+ }
60+ float result = (fCharBin / pow (2.0 , floor (frac (vCoords.x) * 4.0 ) + (floor (vCoords.y * 5.0 ) * 4.0 )));
61+ return floor (result - 2.0 * floor (result/2.0 ));
62+ }
63+
64+ Data VSMain ( float4 vertex:POSITION , float2 uv:TEXCOORD0 )
65+ {
66+ Data VS;
67+ VS.uv = uv;
68+ VS.vertex = vertex;
69+ VS.number = 12.34 ; //vertex shader variable value to print
70+ return VS;
71+ }
72+
73+ [maxvertexcount (9 )]
74+ void GSMain ( triangle Data patch[3 ], inout TriangleStream <Data> stream, uint id:SV_PRIMITIVEID )
75+ {
76+ Data GS;
77+ for (uint i = 0 ; i < 3 ; i++)
78+ {
79+ GS.vertex = UnityObjectToClipPos (patch[i].vertex);
80+ GS.uv = patch[i].uv;
81+ GS.number = patch[i].number;
82+ stream.Append (GS);
83+ }
84+ stream.RestartStrip ();
85+
86+ if (id == 0 ) // determine quad
87+ {
88+ for (uint i = 0 ; i < 6 ; i++)
89+ {
90+ float u = float (i) - 2.0 * floor (float (i)/2.0 );
91+ float v = sign (fmod (126.0 ,fmod (float (i),6.0 )+6.0 ));
92+ GS.uv = float2 (u, 1.0 - v) + 10000.0 ; // UV offset
93+ GS.vertex = float4 (sign (u)+0.5 , sign (v)+0.5 , 0.3 , 1.0 );
94+ GS.number = patch[0 ].number;
95+ stream.Append (GS);
96+ }
97+ }
98+ stream.RestartStrip ();
99+ }
100+
101+ float4 PSMain (Data PS) : SV_Target
102+ {
103+ float value = PS.number;
104+ if (PS.uv.x > 9000.0 ) // determine quad
105+ {
106+ float2 font = float2 (24.0 , 30.0 );
107+ float2 position = float2 (_ScreenParams .x - 250.0 , 15.0 );
108+ float3 base = PrintValue ( (PS.vertex.xy - position) / font, value, 6.0 , 2.0 ).xxx;
109+ return float4 (base, 1.0 );
110+ }
111+ else return tex2D (_MainTex, PS.uv);
112+ }
113+ ENDCG
114+ }
115+ }
116+ }
0 commit comments