@@ -8,8 +8,8 @@ Shader "Hidden/VXGI/Voxelization"
88 Tags { "LightMode" ="Voxelization" }
99
1010 Cull Off
11- ZWrite Off
1211 ZTest Always
12+ ZWrite Off
1313
1414 HLSLPROGRAM
1515 #pragma require geometry
@@ -18,6 +18,8 @@ Shader "Hidden/VXGI/Voxelization"
1818 #pragma geometry geom
1919 #pragma fragment frag
2020 #pragma shader_feature _EMISSION
21+ #pragma shader_feature_local _METALLICGLOSSMAP
22+ #pragma shader_feature_local _SPECGLOSSMAP
2123
2224 #include "UnityCG.cginc"
2325 #include "Packages/com.looooong.srp.vxgi/ShaderLibrary/Variables.cginc"
@@ -29,18 +31,14 @@ Shader "Hidden/VXGI/Voxelization"
2931
3032 CBUFFER_START (UnityPerMaterial)
3133 half4 _Color;
34+ half3 _EmissionColor;
3235 float4 _MainTex_ST;
3336 half _Metallic;
34- half3 _EmissionColor;
3537 CBUFFER_END
3638
39+ sampler2D _EmissionMap;
3740 sampler2D _MainTex;
3841 sampler2D _MetallicGlossMap;
39- sampler2D _EmissionMap;
40-
41- // Map depth [0, 1] to Z coordinate [0, Resolution)
42- static float DepthResolution = Resolution * 0.99999999 ;
43- float4x4 VoxelToProjection;
4442
4543 AppendStructuredBuffer <VoxelData> VoxelBuffer;
4644
@@ -62,9 +60,14 @@ Shader "Hidden/VXGI/Voxelization"
6260 v2g vert (appdata_base v)
6361 {
6462 v2g o;
65- o.vertex = mul (WorldToVoxel, mul ( unity_ObjectToWorld , v.vertex) );
63+ o.vertex = UnityObjectToClipPos ( v.vertex);
6664 o.normal = UnityObjectToWorldNormal (v.normal);
6765 o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
66+
67+ #ifdef UNITY_REVERSED_Z
68+ o.vertex.z = mad (o.vertex.z, -2.0 , 1.0 );
69+ #endif
70+
6871 return o;
6972 }
7073
@@ -107,11 +110,15 @@ Shader "Hidden/VXGI/Voxelization"
107110 for (int j = 0 ; j < 3 ; j++) {
108111 g2f o;
109112
110- o.position = mul (VoxelToProjection, float4 (SwizzleAxis (i[j].vertex, axis), 1.0 ) );
113+ o.position = float4 (SwizzleAxis (i[j].vertex, axis), 1.0 );
111114
112- #if defined (UNITY_REVERSED_Z )
113- o.position.z = 1.0 - o.position.z;
114- #endif
115+ #ifdef UNITY_UV_STARTS_AT_TOP
116+ o.position.y = -o.position.y;
117+ #endif
118+
119+ #ifdef UNITY_REVERSED_Z
120+ o.position.z = mad (o.position.z, 0.5 , 0.5 );
121+ #endif
115122
116123 o.normal = i[j].normal;
117124 o.axis = axis;
@@ -145,23 +152,25 @@ Shader "Hidden/VXGI/Voxelization"
145152
146153 fixed frag (g2f i) : SV_TARGET
147154 {
148- #ifdef _METALLICGLOSSMAP
149- float metallic = tex2D (_MetallicGlossMap, i.uv).r;
150- #else
151- float metallic = _Metallic;
152- #endif
155+ #ifdef _METALLICGLOSSMAP
156+ float metallic = tex2D (_MetallicGlossMap, i.uv).r;
157+ #else
158+ float metallic = _Metallic;
159+ #endif
153160
154161 i.normal = normalize (i.normal);
155162
156- #ifdef _EMISSION
157- float3 emission = _EmissionColor * tex2Dlod (_EmissionMap, float4 (i.uv, 0.0 , 0.0 ));
158- #else
159- float3 emission = 0.0 ;
160- #endif
163+ #ifdef _EMISSION
164+ float3 emission = _EmissionColor * tex2Dlod (_EmissionMap, float4 (i.uv, 0.0 , 0.0 ));
165+ #else
166+ float3 emission = 0.0 ;
167+ #endif
168+
169+ float3 voxelPosition = float3 (i.position.xy, i.position.z * Resolution);
161170
162171 VoxelData d;
163172 d.Initialize ();
164- d.SetPosition (RestoreAxis (float3 (i.position.xy, i.position.z * DepthResolution) , i.axis));
173+ d.SetPosition (RestoreAxis (voxelPosition , i.axis));
165174 d.SetNormal (i.normal);
166175 d.SetColor (mad (-0.5 , metallic, 1.0 ) * _Color * tex2Dlod (_MainTex, float4 (i.uv, 0.0 , 0.0 )));
167176 d.SetEmission (emission + ShadeSH9 (float4 (i.normal, 1.0 )));
0 commit comments