diff options
Diffstat (limited to 'assets/shaders/geodesic.slang')
| -rw-r--r-- | assets/shaders/geodesic.slang | 134 |
1 files changed, 67 insertions, 67 deletions
diff --git a/assets/shaders/geodesic.slang b/assets/shaders/geodesic.slang index 3229aee..4e11b4f 100644 --- a/assets/shaders/geodesic.slang +++ b/assets/shaders/geodesic.slang @@ -12,52 +12,44 @@ VSOutput vertexMain(VSInput input) struct Camera { - float3 camPos; float _pad0; - float3 camRight; float _pad1; - float3 camUp; float _pad2; - float3 camForward; float _pad3; - float tanHalfFov; - float aspect; - bool moving; - int outputChannel; - int rawOutput; + float3 u_cam_pos; float _pad0; + float3 u_cam_right; float _pad1; + float3 u_cam_up; float _pad2; + float3 u_cam_forward; float _pad3; + float u_tan_half_fov; + float u_aspect; + bool u_moving; + int u_output_channel; + int u_raw_output; }; - -float3 Falsecolor(float t) -{ - t = clamp(t, 0.0, 1.0); - return clamp(float3(1.5 - abs(4.0 * t - 3.0), - 1.5 - abs(4.0 * t - 2.0), - 1.5 - abs(4.0 * t - 1.0)), 0.0, 1.0); -} ConstantBuffer<Camera> cam; struct Disk { - float disk_r1; - float disk_r2; - float disk_num; - float thickness; - float disk_density; - float temperature; + float u_inner_radius; + float u_outer_radius; + float u_turbulence; + float u_thickness; + float u_brightness; + float u_temperature; }; ConstantBuffer<Disk> disk; struct Objects { - int numObjects; - float4 objPosRadius[16]; - float4 objColor[16]; - float mass[16]; + int u_num_objects; + float4 u_obj_pos_radius[16]; + float4 u_obj_color[16]; + float u_mass[16]; }; ConstantBuffer<Objects> obj; struct Simulation { - int maxStepsMoving; - int maxStepsStatic; - float earlyExitDistance; - float time; + int u_max_steps_moving; + int u_max_steps_static; + float u_early_exit_distance; + float u_time; }; ConstantBuffer<Simulation> sim; @@ -147,15 +139,15 @@ float3 DiskEmission(float3 P, float3 rayDir, out float outG, out float outTemit) { outG = 0.0; outTemit = 0.0; float rc = length(float2(P.x, P.z)); - float rin = max(disk.disk_r1, R_ISCO); - float rout = disk.disk_r2; + float rin = max(disk.u_inner_radius, R_ISCO); + float rout = disk.u_outer_radius; if (rc < rin || rc > rout) return float3(0.0); float xr = rc / rin; float flux = max((1.0 - sqrt(1.0 / xr)) / (xr * xr * xr), 0.0); float Tn = pow(flux / FLUX_PEAK, 0.25); - float Temit = disk.temperature * Tn; + float Temit = disk.u_temperature * Tn; float3 rhat = normalize(float3(P.x, 0.0, P.z)); float3 phiHat = normalize(cross(float3(0.0, 1.0, 0.0), rhat)); @@ -173,17 +165,17 @@ float3 DiskEmission(float3 P, float3 rayDir, out float outG, out float outTemit) float edge = smoothstep(rin, rin * 1.12, rc) * (1.0 - smoothstep(rout * 0.88, rout, rc)); bright *= edge; - if (disk.disk_num > 0.0) + if (disk.u_turbulence > 0.0) { - float ang = sim.time * 0.3 / sqrt(xr); + float ang = sim.u_time * 0.3 / sqrt(xr); float3 rp = float3(P.x * cos(ang) - P.z * sin(ang), 0.0, P.x * sin(ang) + P.z * cos(ang)) * 1e-10; - float turb = 1.0 + disk.disk_num * (fbm(rp * 3.0, 3) - 0.5); + float turb = 1.0 + disk.u_turbulence * (fbm(rp * 3.0, 3) - 0.5); bright *= max(turb, 0.0); } - return colour * bright * max(disk.disk_density, 0.0); + return colour * bright * max(disk.u_brightness, 0.0); } struct Ray @@ -229,15 +221,15 @@ bool Intercept(Ray ray, float rs) { return ray.r <= rs; } bool InterceptObject(Ray ray, inout Hit hit) { float3 P = float3(ray.x, ray.y, ray.z); - for (int i = 0; i < obj.numObjects; ++i) + for (int i = 0; i < obj.u_num_objects; ++i) { - float3 center = obj.objPosRadius[i].xyz; - float radius = obj.objPosRadius[i].w; + float3 center = obj.u_obj_pos_radius[i].xyz; + float radius = obj.u_obj_pos_radius[i].w; float distSq = dot(P - center, P - center); if (distSq > radius * radius * 4.0) continue; if (distSq <= radius * radius) { - hit.objectColor = obj.objColor[i]; + hit.objectColor = obj.u_obj_color[i]; hit.hitCenter = center; hit.hitRadius = radius; return true; @@ -285,8 +277,8 @@ float CalculateAdaptiveStepSize(Ray ray, float baseStepSize) float step = 0.02 * max(ray.r - R_PHOTON, 0.0); float rc = length(float2(ray.x, ray.z)); - if (rc < disk.disk_r2 * 3.0 && abs(ray.y) < disk.thickness * 8.0) - step = min(step, disk.thickness); + if (rc < disk.u_outer_radius * 3.0 && abs(ray.y) < disk.u_thickness * 8.0) + step = min(step, disk.u_thickness); return clamp(step, MIN_STEP_SIZE, MAX_STEP_SIZE); } @@ -296,13 +288,21 @@ float3 ACESFilm(float3 x) return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0); } +float3 Falsecolor(float t) +{ + t = clamp(t, 0.0, 1.0); + return clamp(float3(1.5 - abs(4.0 * t - 3.0), + 1.5 - abs(4.0 * t - 2.0), + 1.5 - abs(4.0 * t - 1.0)), 0.0, 1.0); +} + float3 TracePixel(float2 texCoord, out float outG, out float outTemit, out bool outHitDisk) { outG = 0.0; outTemit = 0.0; outHitDisk = false; - float u = (2.0 * texCoord.x - 1.0) * cam.aspect * cam.tanHalfFov; - float v = (1.0 - 2.0 * texCoord.y) * cam.tanHalfFov; - float3 dir = normalize(u * cam.camRight - v * cam.camUp + cam.camForward); - Ray ray = InitRay(cam.camPos, dir); + float u = (2.0 * texCoord.x - 1.0) * cam.u_aspect * cam.u_tan_half_fov; + float v = (1.0 - 2.0 * texCoord.y) * cam.u_tan_half_fov; + float3 dir = normalize(u * cam.u_cam_right - v * cam.u_cam_up + cam.u_cam_forward); + Ray ray = InitRay(cam.u_cam_pos, dir); bool hitBlackHole = false; bool hitObject = false; @@ -314,11 +314,11 @@ float3 TracePixel(float2 texCoord, out float outG, out float outTemit, out bool bool hitDisk = false; float3 diskColor = float3(0.0); - int maxSteps = cam.moving ? sim.maxStepsMoving : sim.maxStepsStatic; + int maxSteps = cam.u_moving ? sim.u_max_steps_moving : sim.u_max_steps_static; if (maxSteps <= 0) - maxSteps = cam.moving ? DEFAULT_MAX_STEPS_MOVING : DEFAULT_MAX_STEPS_STATIC; + maxSteps = cam.u_moving ? DEFAULT_MAX_STEPS_MOVING : DEFAULT_MAX_STEPS_STATIC; - float exitDistance = sim.earlyExitDistance > 0.0 ? sim.earlyExitDistance : DEFAULT_EARLY_EXIT_DISTANCE; + float exitDistance = sim.u_early_exit_distance > 0.0 ? sim.u_early_exit_distance : DEFAULT_EARLY_EXIT_DISTANCE; int objectCheckInterval = 5; for (int i = 0; i < maxSteps; ++i) @@ -332,7 +332,7 @@ float3 TracePixel(float2 texCoord, out float outG, out float outTemit, out bool float3 newPos = float3(ray.x, ray.y, ray.z); { - float H = disk.thickness; + float H = disk.u_thickness; bool crossed = prevPos.y * newPos.y < 0.0; bool inSlab = abs(newPos.y) <= H; if (crossed || inSlab) @@ -341,7 +341,7 @@ float3 TracePixel(float2 texCoord, out float outG, out float outTemit, out bool ? lerp(prevPos, newPos, prevPos.y / (prevPos.y - newPos.y)) : newPos; float rc = length(float2(hitP.x, hitP.z)); - if (rc >= max(disk.disk_r1, R_ISCO) && rc <= disk.disk_r2) + if (rc >= max(disk.u_inner_radius, R_ISCO) && rc <= disk.u_outer_radius) { diskColor = DiskEmission(hitP, newPos - prevPos, outG, outTemit); hitDisk = true; @@ -356,7 +356,7 @@ float3 TracePixel(float2 texCoord, out float outG, out float outTemit, out bool if (ray.dr > 0.0 && ray.r > 50.0 * SagA_rs) break; } - float3 rayDir = normalize(float3(ray.x, ray.y, ray.z) - cam.camPos); + float3 rayDir = normalize(float3(ray.x, ray.y, ray.z) - cam.u_cam_pos); float footprint = max(length(ddx(rayDir)), length(ddy(rayDir))); float envLod = clamp(log2(max(footprint / 0.0015, 1.0)), 0.0, 10.0); @@ -373,7 +373,7 @@ float3 TracePixel(float2 texCoord, out float outG, out float outTemit, out bool { float3 P = float3(ray.x, ray.y, ray.z); float3 N = normalize(P - hit.hitCenter); - float3 V = normalize(cam.camPos - P); + float3 V = normalize(cam.u_cam_pos - P); float intensity = 0.1 + 0.9 * max(dot(N, V), 0.0); shade = hit.objectColor.rgb * intensity; } @@ -388,39 +388,39 @@ float3 TracePixel(float2 texCoord, out float outG, out float outTemit, out bool [shader("fragment")] float4 fragmentMain(VSOutput input) : SV_Target { - if (cam.outputChannel != 0) + if (cam.u_output_channel != 0) { float g, Temit; bool hitDisk; TracePixel(input.texCoord, g, Temit, hitDisk); float value; float valid = 1.0; - if (cam.outputChannel == 3) + if (cam.u_output_channel == 3) { - float uu = (2.0 * input.texCoord.x - 1.0) * cam.aspect * cam.tanHalfFov; - float vv = (1.0 - 2.0 * input.texCoord.y) * cam.tanHalfFov; - float3 dir = normalize(uu * cam.camRight - vv * cam.camUp + cam.camForward); - value = length(cross(cam.camPos, dir)) / SagA_rs; + float uu = (2.0 * input.texCoord.x - 1.0) * cam.u_aspect * cam.u_tan_half_fov; + float vv = (1.0 - 2.0 * input.texCoord.y) * cam.u_tan_half_fov; + float3 dir = normalize(uu * cam.u_cam_right - vv * cam.u_cam_up + cam.u_cam_forward); + value = length(cross(cam.u_cam_pos, dir)) / SagA_rs; } else { valid = hitDisk ? 1.0 : 0.0; - value = (cam.outputChannel == 1) ? g : Temit; + value = (cam.u_output_channel == 1) ? g : Temit; } - if (cam.rawOutput != 0) + if (cam.u_raw_output != 0) return float4(value, value, value, valid); if (valid < 0.5) return float4(0.0, 0.0, 0.0, 1.0); - float norm = (cam.outputChannel == 1) ? value / 1.5 - : (cam.outputChannel == 2) ? value / 15000.0 + float norm = (cam.u_output_channel == 1) ? value / 1.5 + : (cam.u_output_channel == 2) ? value / 15000.0 : value / 30.0; return float4(Falsecolor(norm), 1.0); } float _g, _t; bool _hd; - if (cam.rawOutput != 0) + if (cam.u_raw_output != 0) return float4(TracePixel(input.texCoord, _g, _t, _hd), 1.0); - if (cam.moving) + if (cam.u_moving) return float4(ACESFilm(TracePixel(input.texCoord, _g, _t, _hd)), 1.0); float2 dUV = float2(ddx(input.texCoord.x), ddy(input.texCoord.y)); |
