Skip to content

Commit 0d5b7eb

Browse files
committed
Add Vulkan debug ground texture handling
1 parent df4cb66 commit 0d5b7eb

2 files changed

Lines changed: 92 additions & 22 deletions

File tree

asset/shader/vulkan/raytrace.rgen

Lines changed: 92 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ struct HitInfo
113113
vec4 color;
114114
};
115115

116+
bool IsOpaque(const HitInfo hit);
117+
116118
int 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
// ----------------------------------------------------------------------------
181231
float DistributionGGX(vec3 N, vec3 H, float roughness)
182232
{
@@ -228,38 +278,54 @@ vec4 SampleTextureLod0(sampler2D sampler_texture, vec2 uv)
228278

229279
vec3 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

237299
vec3 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

244307
float 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

251315
float 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

258323
float 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

265331
float 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

310380
float 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

frame/vulkan/device.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3342,10 +3342,6 @@ void Device::RecordCommandBuffer(
33423342
block.model_inv = glm::inverse(*shared_scene_model);
33433343
}
33443344
}
3345-
else if (scene.has_uniform_block)
3346-
{
3347-
block = scene.uniform_block;
3348-
}
33493345
}
33503346
buffer_resources_->UpdateUniform(
33513347
current_frame_,

0 commit comments

Comments
 (0)