hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/assets/shaders/geodesic.slang
diff options
context:
space:
mode:
Diffstat (limited to 'assets/shaders/geodesic.slang')
-rw-r--r--assets/shaders/geodesic.slang134
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));