@@ -87,6 +87,7 @@ int g_isReflective;
8787vec4 g_temp;
8888
8989
90+
9091vec3 GI(vec3 worldPos, vec3 worldNormal){
9192 const float VOXEL_SIZE = 1.0 / float (settings.vxgi.resolution);
9293 const float ISQRT2 = 0.707106 ;
@@ -112,35 +113,36 @@ vec3 GI(vec3 worldPos, vec3 worldNormal){
112113 // Backward in cone direction improves GI, and forward direction removes
113114 // artifacts.
114115 const float CONE_OFFSET = - 0.01 ;
116+ const float CONE_SPREAD = 0.325 ;
115117
116118 // Trace front cone
117- indirect += w[0 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * worldNormal, worldNormal, VOXEL_SIZE );
119+ indirect += w[0 ] * traceVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * worldNormal, worldNormal,CONE_SPREAD , VOXEL_SIZE );
118120
119121 // Trace 4 side cones.
120122 const vec3 s1 = mix (worldNormal, ortho, ANGLE_MIX);
121- indirect += w[1 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * ortho, s1, VOXEL_SIZE );
123+ indirect += w[1 ] * traceVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * ortho, s1,CONE_SPREAD , VOXEL_SIZE );
122124
123125 const vec3 s2 = mix (worldNormal, - ortho, ANGLE_MIX);
124- indirect += w[1 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * ortho, s2, VOXEL_SIZE );
126+ indirect += w[1 ] * traceVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * ortho, s2,CONE_SPREAD , VOXEL_SIZE );
125127
126128 const vec3 s3 = mix (worldNormal, ortho2, ANGLE_MIX);
127- indirect += w[1 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * ortho2, s3, VOXEL_SIZE );
129+ indirect += w[1 ] * traceVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * ortho2, s3,CONE_SPREAD , VOXEL_SIZE );
128130
129131 const vec3 s4 = mix (worldNormal, - ortho2, ANGLE_MIX);
130- indirect += w[1 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * ortho2, s4, VOXEL_SIZE );
132+ indirect += w[1 ] * traceVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * ortho2, s4,CONE_SPREAD , VOXEL_SIZE );
131133
132134 // Trace 4 corner cones.
133135 const vec3 c1 = mix (worldNormal, corner, ANGLE_MIX);
134- indirect += w[2 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * corner, c1, VOXEL_SIZE );
136+ indirect += w[2 ] * traceVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * corner, c1,CONE_SPREAD , VOXEL_SIZE );
135137
136138 const vec3 c2 = mix (worldNormal, - corner, ANGLE_MIX);
137- indirect += w[2 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * corner, c2, VOXEL_SIZE );
139+ indirect += w[2 ] * traceVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * corner, c2,CONE_SPREAD , VOXEL_SIZE );
138140
139141 const vec3 c3 = mix (worldNormal, corner2, ANGLE_MIX);
140- indirect += w[2 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * corner2, c3, VOXEL_SIZE );
142+ indirect += w[2 ] * traceVoxelCone (voxelMap, C_ORIGIN + CONE_OFFSET * corner2, c3,CONE_SPREAD , VOXEL_SIZE );
141143
142144 const vec3 c4 = mix (worldNormal, - corner2, ANGLE_MIX);
143- indirect += w[2 ] * traceDiffuseVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * corner2, c4, VOXEL_SIZE );
145+ indirect += w[2 ] * traceVoxelCone (voxelMap, C_ORIGIN - CONE_OFFSET * corner2, c4,CONE_SPREAD , VOXEL_SIZE );
144146
145147 // Return result.
146148 // return DIFFUSE_INDIRECT_FACTOR * material.diffuseReflectivity * acc * (material.diffuseColor + vec3(0.001f));
@@ -187,6 +189,7 @@ void main()
187189 vec3 direct = vec3 (0.0 );
188190 vec3 ambient = vec3 (0.0 );
189191 vec3 indirect = vec3 (0.0 );
192+ vec3 indirect2 = vec3 (0.0 );
190193
191194 vec3 modelPos = (camera.invView * vec4 (g_pos.xyz, 1.0 )).xyz;
192195 vec3 modelNormal = (camera.invView * vec4 (g_normal.xyz, 0.0 )).xyz;
@@ -206,12 +209,50 @@ void main()
206209 brdf.F0 = vec3 (0.04 );
207210 brdf.F0 = mix (brdf.F0, brdf.albedo, brdf.metalness);
208211 brdf.emission = g_emission;
209-
210- // GI ____________________________
212+ // Indirect Component ____________________________
211213 if (settings.vxgi.enabled == 1 ){
212- indirect = GI(modelPos, modelNormal)* settings.vxgi.strength* g_albedo;
214+ vec3 diffuseIndirect = vec3 (0.0 );
215+
216+ const float VOXEL_SIZE = 1.0 / float (settings.vxgi.resolution);
217+
218+
219+ // Offset startPos to avoid self occlusion
220+ vec3 startPos = modelPos + modelNormal * VOXEL_SIZE;
221+
222+ float coneTraceCount = 0.0 ;
223+ float cosSum = 0.0 ;
224+ for (int i = 0 ; i < DIFFUSE_CONE_COUNT; ++ i)
225+ {
226+ float cosTheta = dot (modelNormal, DIFFUSE_CONE_DIRECTIONS[i]);
227+
228+ if (cosTheta < 0.0 )
229+ continue ;
230+
231+ coneTraceCount += 1.0 ;
232+ diffuseIndirect += traceVoxelCone(voxelMap, startPos, DIFFUSE_CONE_DIRECTIONS[i],DIFFUSE_CONE_APERTURE , VOXEL_SIZE );
233+ }
234+
235+ diffuseIndirect /= coneTraceCount;
236+ // indirectContribution.a *= u_ambientOcclusionFactor;
237+
238+ diffuseIndirect.rgb *= g_albedo * settings.vxgi.strength;
239+
240+
241+ indirect = diffuseIndirect.rgb;
242+
243+
244+ // indirect = GI(modelPos, modelNormal)*settings.vxgi.strength*g_albedo;
213245 indirect*= settings.enableAO == 1 ? (brdf.ao * SSAO) : brdf.ao;
246+
247+ // vec3 specularConeDirection = reflect(normalize(camera.position.xyz-modelPos), modelNormal);
248+ // vec3 specularIndirect = vec3(0.0);
249+
250+
251+ // specularIndirect = traceVoxelCone(voxelMap, startPos, specularConeDirection, max(brdf.roughness, 0.05) , VOXEL_SIZE );
252+ // // specularIndirect = castCone(startPos, specularConeDirection, max(roughness, MIN_SPECULAR_APERTURE), MAX_TRACE_DISTANCE, minLevel).rgb * specColor.rgb * u_indirectSpecularIntensity;
253+ // indirect2+=specularIndirect;
214254 }
255+
215256
216257 // Direct Component ________________________
217258 for (int i = 0 ; i < scene.numLights; i++ ) {
@@ -232,7 +273,6 @@ void main()
232273 if (scene.lights[i].shadowType == 1 ) // VSM
233274 lighting *= computeVarianceShadow(shadowMap, scene.lights[i], i, modelPos);
234275 if (scene.lights[i].shadowType == 2 ) // Raytraced
235- // lighting *= traceShadowCone(voxelMap, modelPos, scene.lights[i].type != DIRECTIONAL_LIGHT ? scene.lights[i].worldPosition.xyz - modelPos : scene.lights[i].shadowData.xyz, modelNormal, 1.0/float(settings.vxgi.resolution), length(scene.lights[i].worldPosition.xyz - modelPos) );
236276 lighting *= computeRaytracedShadow(
237277 TLAS,
238278 blueNoiseMap,
@@ -263,6 +303,7 @@ void main()
263303 ambient = (scene.ambientIntensity * scene.ambientColor) * brdf.albedo;
264304 }
265305 ambient *= settings.enableAO == 1 ? (brdf.ao * SSAO) : brdf.ao;
306+
266307 // SSR ________________________________
267308 vec3 fresnel = fresnelSchlick(max (dot (g_normal, normalize (g_pos)), 0.0 ), brdf.F0);
268309 if (settings.ssr.enabled == 1 && g_isReflective == 1 ){
0 commit comments