@@ -113,6 +113,8 @@ struct HitInfo
113113 vec4 color;
114114};
115115
116+ bool IsOpaque(const HitInfo hit);
117+
116118int TriangleCountTransmissive()
117119{
118120 int uniform_count = max(0, int(ubo.time_s.y + 0.5));
@@ -177,6 +179,54 @@ mat3 GetNormalMatrix(const HardwareRaytraceInstanceData instance_data)
177179 return transpose(mat3(GetWorldToObject(instance_data)));
178180}
179181
182+ vec3 GetObjectScale(const HardwareRaytraceInstanceData instance_data)
183+ {
184+ const mat4 object_to_world = GetObjectToWorld(instance_data);
185+ return vec3(
186+ length(object_to_world[0].xyz),
187+ length(object_to_world[1].xyz),
188+ length(object_to_world[2].xyz));
189+ }
190+
191+ bool IsGroundDebugInstance(
192+ const HitInfo hit,
193+ const HardwareRaytraceInstanceData instance_data)
194+ {
195+ if (!IsOpaque(hit))
196+ {
197+ return false;
198+ }
199+
200+ const vec3 object_scale = GetObjectScale(instance_data);
201+ if (object_scale.x < 20.0 || object_scale.z < 20.0 || object_scale.y > 2.0)
202+ {
203+ return false;
204+ }
205+
206+ const vec3 world_normal =
207+ normalize(GetNormalMatrix(instance_data) * hit.normal_model);
208+ return abs(world_normal.y) > 0.65;
209+ }
210+
211+ vec2 GetSurfaceUv(const HitInfo hit)
212+ {
213+ if (hit.instance_index < 0)
214+ {
215+ return hit.uv;
216+ }
217+
218+ const HardwareRaytraceInstanceData instance_data =
219+ GetRaytraceInstanceData(hit.instance_index);
220+ if (!IsGroundDebugInstance(hit, instance_data))
221+ {
222+ return hit.uv;
223+ }
224+
225+ const vec3 object_scale = GetObjectScale(instance_data);
226+ return hit.uv *
227+ max(vec2(1.0), vec2(object_scale.x, object_scale.z)) * 0.125;
228+ }
229+
180230// ----------------------------------------------------------------------------
181231float DistributionGGX(vec3 N, vec3 H, float roughness)
182232{
@@ -228,38 +278,54 @@ vec4 SampleTextureLod0(sampler2D sampler_texture, vec2 uv)
228278
229279vec3 SampleAlbedo(const HitInfo hit)
230280{
231- vec3 base = IsOpaque(hit)
232- ? SampleTextureLod0(opaque_albedo_texture, hit.uv).rgb
233- : SampleTextureLod0(transmissive_albedo_texture, hit.uv).rgb;
281+ if (!IsOpaque(hit))
282+ {
283+ return SampleTextureLod0(transmissive_albedo_texture, hit.uv).rgb *
284+ hit.color.rgb;
285+ }
286+
287+ const HardwareRaytraceInstanceData instance_data =
288+ GetRaytraceInstanceData(hit.instance_index);
289+ if (!IsGroundDebugInstance(hit, instance_data))
290+ {
291+ return hit.color.rgb;
292+ }
293+
294+ const vec3 base =
295+ SampleTextureLod0(opaque_albedo_texture, GetSurfaceUv(hit)).rgb;
234296 return base * hit.color.rgb;
235297}
236298
237299vec3 SampleNormalMap(const HitInfo hit)
238300{
301+ const vec2 uv = GetSurfaceUv(hit);
239302 return IsOpaque(hit)
240- ? SampleTextureLod0(opaque_normal_texture, hit. uv).xyz
241- : SampleTextureLod0(transmissive_normal_texture, hit. uv).xyz;
303+ ? SampleTextureLod0(opaque_normal_texture, uv).xyz
304+ : SampleTextureLod0(transmissive_normal_texture, uv).xyz;
242305}
243306
244307float SampleRoughness(const HitInfo hit)
245308{
309+ const vec2 uv = GetSurfaceUv(hit);
246310 return IsOpaque(hit)
247- ? SampleTextureLod0(opaque_roughness_texture, hit. uv).r
248- : SampleTextureLod0(transmissive_roughness_texture, hit. uv).r;
311+ ? SampleTextureLod0(opaque_roughness_texture, uv).r
312+ : SampleTextureLod0(transmissive_roughness_texture, uv).r;
249313}
250314
251315float SampleMetallic(const HitInfo hit)
252316{
317+ const vec2 uv = GetSurfaceUv(hit);
253318 return IsOpaque(hit)
254- ? SampleTextureLod0(opaque_metallic_texture, hit. uv).r
255- : SampleTextureLod0(transmissive_metallic_texture, hit. uv).r;
319+ ? SampleTextureLod0(opaque_metallic_texture, uv).r
320+ : SampleTextureLod0(transmissive_metallic_texture, uv).r;
256321}
257322
258323float SampleAo(const HitInfo hit)
259324{
325+ const vec2 uv = GetSurfaceUv(hit);
260326 return IsOpaque(hit)
261- ? SampleTextureLod0(opaque_ao_texture, hit. uv).r
262- : SampleTextureLod0(transmissive_ao_texture, hit. uv).r;
327+ ? SampleTextureLod0(opaque_ao_texture, uv).r
328+ : SampleTextureLod0(transmissive_ao_texture, uv).r;
263329}
264330
265331float SampleSpecularFactor(const HitInfo hit)
@@ -269,7 +335,7 @@ float SampleSpecularFactor(const HitInfo hit)
269335 return 1.0;
270336 }
271337 return clamp(
272- SampleTextureLod0(opaque_specular_factor_texture, hit.uv ).a,
338+ SampleTextureLod0(opaque_specular_factor_texture, GetSurfaceUv( hit) ).a,
273339 0.0,
274340 1.0);
275341}
@@ -281,7 +347,9 @@ vec3 SampleSpecularColor(const HitInfo hit)
281347 return vec3(1.0);
282348 }
283349 return clamp(
284- SampleTextureLod0(opaque_specular_color_texture, hit.uv).rgb,
350+ SampleTextureLod0(
351+ opaque_specular_color_texture,
352+ GetSurfaceUv(hit)).rgb,
285353 0.0,
286354 1.0);
287355}
@@ -293,7 +361,7 @@ float SampleTransmission(const HitInfo hit)
293361 return 0.0;
294362 }
295363 return clamp(
296- SampleTextureLod0(transmissive_transmission_texture, hit.uv ).r,
364+ SampleTextureLod0(transmissive_transmission_texture, GetSurfaceUv( hit) ).r,
297365 0.0,
298366 1.0);
299367}
@@ -304,7 +372,9 @@ float SampleIor(const HitInfo hit)
304372 {
305373 return 1.0;
306374 }
307- return max(SampleTextureLod0(transmissive_ior_texture, hit.uv).r, 1.0);
375+ return max(
376+ SampleTextureLod0(transmissive_ior_texture, GetSurfaceUv(hit)).r,
377+ 1.0);
308378}
309379
310380float SampleThickness(const HitInfo hit)
@@ -314,7 +384,7 @@ float SampleThickness(const HitInfo hit)
314384 return 0.0;
315385 }
316386 return max(
317- SampleTextureLod0(transmissive_thickness_texture, hit.uv ).r,
387+ SampleTextureLod0(transmissive_thickness_texture, GetSurfaceUv( hit) ).r,
318388 0.0);
319389}
320390
@@ -325,7 +395,9 @@ vec3 SampleAttenuationColor(const HitInfo hit)
325395 return vec3(1.0);
326396 }
327397 return clamp(
328- SampleTextureLod0(transmissive_attenuation_color_texture, hit.uv).rgb,
398+ SampleTextureLod0(
399+ transmissive_attenuation_color_texture,
400+ GetSurfaceUv(hit)).rgb,
329401 0.0,
330402 1.0);
331403}
@@ -337,7 +409,9 @@ float SampleAttenuationDistance(const HitInfo hit)
337409 return 1000000.0;
338410 }
339411 return max(
340- SampleTextureLod0(transmissive_attenuation_distance_texture, hit.uv).r,
412+ SampleTextureLod0(
413+ transmissive_attenuation_distance_texture,
414+ GetSurfaceUv(hit)).r,
341415 0.0001);
342416}
343417
0 commit comments