// WebGPU wavefront raygen. Runs in GENERATE: compute the pinhole camera // ray and emit it as the pixel's primary ray. Shading happens later in // SHADE (closesthit/miss). The Payload type is declared in closesthit.wgsl. fn raygen_main(gid: vec3) { if (gid.x >= wfParams.surfaceW || gid.y >= wfParams.surfaceH) { return; } let pixel = vec2(f32(gid.x), f32(gid.y)); let resolution = vec2(f32(wfParams.surfaceW), f32(wfParams.surfaceH)); let uv = (pixel + vec2(0.5)) / resolution; let ndc = uv * 2.0 - vec2(1.0); let origin = vec3(0.0, 0.0, -300.0); let aspect = resolution.x / resolution.y; let fov = 60.0 * 3.14159265 / 180.0; let tanHalfFov = tan(fov * 0.5); let direction = normalize(vec3( ndc.x * aspect * tanHalfFov, -ndc.y * tanHalfFov, 1.0, )); var payload: Payload; payload.color = vec3(0.0); rtEmitPrimaryRay( origin, 0.001, direction, 10000.0, 0u, // ray flags 0xFFu, // cull mask 0u, 0u, // sbtRecordOffset, missIndex payload); }