31 lines
1.4 KiB
Text
31 lines
1.4 KiB
Text
|
|
//SPDX-License-Identifier: LGPL-3.0-only
|
||
|
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
||
|
|
|
||
|
|
#version 460
|
||
|
|
#extension GL_EXT_ray_tracing : enable
|
||
|
|
#extension GL_EXT_shader_image_load_formatted : enable
|
||
|
|
#extension GL_EXT_shader_explicit_arithmetic_types_int16 : enable
|
||
|
|
#extension GL_EXT_descriptor_heap : enable
|
||
|
|
#extension GL_EXT_nonuniform_qualifier : enable
|
||
|
|
|
||
|
|
// Hits take their colour from the pass's push data; the TLAS comes from the
|
||
|
|
// heap, so on NVIDIA the pass also pushes the TLAS address, after this block.
|
||
|
|
layout(constant_id = 0) const uint16_t bufferStart = 0us;
|
||
|
|
layout(descriptor_heap) uniform accelerationStructureEXT topLevelAS[];
|
||
|
|
layout(descriptor_heap) uniform writeonly image2D image[];
|
||
|
|
layout(push_constant) uniform Push { vec4 hitColour; } push;
|
||
|
|
|
||
|
|
layout(location = 0) rayPayloadEXT float hit;
|
||
|
|
|
||
|
|
void main() {
|
||
|
|
uvec2 pixel = gl_LaunchIDEXT.xy;
|
||
|
|
uvec2 resolution = gl_LaunchSizeEXT.xy;
|
||
|
|
vec2 ndc = (vec2(pixel) + 0.5) / vec2(resolution) * 2.0 - 1.0;
|
||
|
|
vec3 origin = vec3(0.0, 0.0, -300.0);
|
||
|
|
float aspect = float(resolution.x) / float(resolution.y);
|
||
|
|
float tanHalfFov = tan(radians(60.0) * 0.5);
|
||
|
|
vec3 direction = normalize(vec3(ndc.x * aspect * tanHalfFov, -ndc.y * tanHalfFov, 1.0));
|
||
|
|
|
||
|
|
traceRayEXT(topLevelAS[bufferStart], gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, origin, 0.001, direction, 10000.0, 0);
|
||
|
|
imageStore(image[0], ivec2(pixel), hit > 0.5 ? push.hitColour : vec4(0.0, 0.0, 0.25, 1.0));
|
||
|
|
}
|