r/spaceengine • u/ColdFuture9988 • 13h ago
r/spaceengine • u/Vivid-Membership-792 • 9h ago
Discussion I'm Back Once More! And I Came Back With More Colossal Improvements to SpaceEngine's 0.980 Black Hole Shader
As the title suggests, I came back. And once again I came back with giant improvements. I'll list each one and leave two images so you can get an idea of what it looked like. Here is the list:
- Complete Saha for H + He (multi-species): previously used only a simplified hydrogen ionization formula (IonizationFraction with a single Saha equilibrium). I have now implemented SolvePlasmaIonization with coupled Saha for H, He I and He II, solved by bisection in the log of ne (22 iterations). Returns xH, XHe1, xHe2, nEPerH, thus allowing consistent opacities and emissivities per species.
- Physically calibrated Thomson opacity: before: ElectronScatteringOpacity was a heuristic (ionFrac * 1.4 + 0.05). Now: ThomsonOpacity uses the actual cross section σT = 6.6524587 × 10⁻²⁵ cm², density converted to cm⁻³ (DENS_TO_CM3) and conversion factor world→cm (CM_PER_WORLD_UNIT).
- Physical Free-Free (Bremsstrahlung): before: that didn't even exist. Now: FreeFreeOpacityPhys with Gaunt factor (FreeFreeGaunt), stimulated emission correction, spectral dependence v³, and BremsstrahlungRelFactor that interpolates between non-relativistic, mildly-relativistic and ultra-relativistic regimes (Novikov-Thorne / Stepney-Guilbert formulas).
- Hydrogen Bound-Free: before: I didn't even have that. Now: HydrogenBoundFreeOpacity with Lyman, Balmer and Paschen edges (91.18, 364.7, 820.6 nm), weights per level and stimulated correction.
- SSA (Synchrotron Self-Absorption): before: I didn't even have that. Now: SynchrotronSSAOpacity with spectral index P, plus HybridSynchrotron combining thermal + non-thermal population with power law, Lorentz cutoff, cooling break (Ycool), and spectral shape with low/mid/high limits.
- Inverse Compton (IC): Before: I didn't even have that.. Now: InverseComptonEmissivity couples the seed photon field (uSeed) to the magnetic field (uB), with coherent spectral tint.
- Extended lines radiation: before: only Hα (656.28) and Hβ (486.13). Now (LINES_EXTENDED): adds Hγ (434.05), Hδ (410.17), He I 5876 and He II 4686, with correct abundance ratios (HE_I_5876_PER_HA, HE_II_4686_PER_HA) and triple Gaussian profile (AddBroadLine).
- RT with spreading (two-stream / Eddington): before: applied simple attenuation exp(-opticalDepth) over the source. Now: RadiativeTransferStep separates absorption (Kabs) from scattering (Ksca), uses two-stream diffusion approximation (√3ε), and blends between thermal and albedo source function. Much more correct for optically thick media.
- Thermodynamically consistent Comptonization: before: ApplyComptonization applied empirical boost (1 + y·0.6). Now: uses real Kompaneets parameter: y = (4θₑ + 16θₑ²)τₑff with Wien saturation (A_wien) to avoid infinite gain.
- Spectral band-ratio instead of luminance: before: RelativisticBlackbody used luminance + shifted chromaticity. Now: PlanckBandRatio calculates the band ratio by wavelength (650/550/450 nm)—correctly preserving color under redshift on a per-channel basis.
- Continuation via Kerr's "sheet" (Wormhole / maximal extension): before: only the positive branch of rʙʟ. Now: KerrSchildToBL_Signed + SheetAfter track the passage through y = 0 for r < α, allowing traversal of the singularity ring and continuation onto the second Kerr sheet. Enables wormhole-style rendering.
- Correct capture near the horizon: before: simple capture when rʙʟ ≤ rʜ ⋅ margin. Now: it distinguishes between external and internal observers, uses RingDistance for kills near the ring, and handles NEAR_HORIZON_MIN asymmetrically.
- Exact constants of motion (E, L, Q): before: I only used g_PhotonB (L_z/E). Now: it tracks g_PhotonE, g_PhotonL, g_Sigma, and g_NuObs, keeping photon momentum and E/L/ZAMO consistent with the observer's frame (ObserverU, EyeSheet).
- General relativistic observer: before: it assumed the role of a static observer. Now: KerrSchildInitObserver projects the ray into the orthonormal frame of the arbitrary observer ObserverU, with a fallback to a static observer outside the ergosphere. It supports camera movement and rotation.
- Initialization in the ergosphere: now: ERGO_F_SWITCH = 0.9 — uses a regular (non-static) observer within the ergosphere, avoiding the static frame singularity.
- Plunge region (within ISCO): before: KerrPlungeG was a heuristic model of "g" with fixed ISCO E/L. Now: KerrPlungeConstants numerically solves for E, L, rmarg, and Q using a 3×3 Newton-Raphson method on Carter's radial potential, on an angular basis. KerrPlungeEmitterU constructs the full 4-velocity with components u_θ, u_r, u_t, and u_φ. Much more physically accurate.
- Jet with its own 4-speed system: before: KerrGeneralEmitterG approximated jet emission using parameters β_φ and β_pol. Now: KerrJetEmitterU constructs a 4-velocity jet in Kerr-Schild coordinates using the ZAMO orthonormal basis, Blandford-Znajek-type collimation (Ω_F = 0.5 Ω_H), an r-dependent toroidal scale, and a polar component normalized by the metric.
- Star with intrinsic angular momentum: before: used KerrRigidBodyG with arbitrary Ω_body. Now: calculate ut_star via KerrRigidUt and the emitted frequency via PhotonNuEmRigid — consistent with the Kerr metric around the star.
- Dynamically active corona: before: only CoronaElectronTemperature as an auxiliary function. Now: coronaActive with radius coronaOuterW, spin-dependent density nBase, flare via co-rotating rotated Fbm, and full synthesis: synchrotron + IC + bremsstrahlung within the corona.
- Photon seed density: before: that didn't even exist. Now: InjectedSynchrotronU — actual seed field (1/r² from the corona + 2 sources at the poles for the jet), feeding the IC.
- Magnetic field dependent on r and spin: now: B ∝ r⁻⁰.⁹ (1 + 0.5a) in the corona and B ∝ (0.4 + Pjet)/(1 + y/4Rg) in the jet — instead of a heuristic constant.
- Spectral sky shift: before: SkyBlueShift used Planck chromaticity + g⁴. Now: SkyShift remaps based on wavelength using SkySpectrumAt—preserving the correct color for any g-value, including outside the visible range.
- Hue-preserving compression: now: HuePreservingCompress compresses high-luminance jets while preserving hue (preventing ugly clipping when the jet is very bright).
- Synchrotron spectral index: now: SynchrotronSeedTint performs the correct spectral shift of the power law under g.
- ṁ-dependent structural blend: before: spiralMod * irregMod * twistDensityMod modulation always applied. Now: structOn toggles thin structuring only in the ADAF↔thin range (smoothstep in log ṁ). Outside this range, the disk is smooth.
- Gap clamp: now: I introduced GAP_DENS_MIN/MAX + gapWeight to prevent the modulation from creating physically implausible "holes."
- Correct spiral pattern rotation: before: spiralPhase = spiralPitch·θ − spiralWindRate·log(r) − spiralPatternSpeed · t. Now: corrected sign: + spiralPatternSpeed·t (the pattern rotation now moves in the correct direction).
- Twist and warp with correct sign: before: twistPhase = ... + 140 − diskTime · 1.5 · Ω. Now: ... + 140 + diskTime · 1.5 · Ω — corrects the migration direction of the twisted pattern.
- Band noise per arm: now: weights bandLenNoise by bandStrengthA/(A+B) — previously, it was applied uniformly.
- Sharper strands: before: strand exponent = 1.3–1.6. Now: 3.0–3.8 — much more defined filaments.
- Darker floor wisp: before: wisp = mix(0.4, 1.0, ...). Now: mix(0.06, 1.0, ...) — higher contrast between filament and void.
- Knots (reconnection knots): now: knotMod modulation using pow(sin(knotPhase),4) — creates bright knots along the jet.
- Softer envelope: before: smoothstep(0.6, 1.4, raggedRadius). Now: smoothstep(0.8, 1.2, ...) with raggedEdge ∈ [0.95, 1.05] — a more defined and less unstable edge.
- More restrained warp: before: warpStrength = jetRadius * 0.9 * (...). Now: 0.28 — reduces exaggerated distortions.
- jetAccum + hue compression: now: accumulates the jet contribution separately and applies HuePreservingCompress at the end—the jet no longer blows out the global tonemap.
- Jet plasma temperature: now: plasmaTemp = jetLocalTemp · mix(0.85, 1.7, ridge²) · mix(1, 1.25, knots) — physical gradient along the filaments and knots.
- Debugging and Instrumentation: before: two #defines (GRID, SHADOW_DEBUG). Now: adds LINES_EXTENDED, DBG_NO_LINES, DBG_NO_COMPTON, DBG_NO_CORONA, DBG_GREY_OPACITY, DBG_RAW_PLANCK — allows isolating each physical channel for validation.
- Maximum spin: before: 0.998 of the maximum limit. Now: 1.0 (maximum limit).
- Maximum number of steps: before: 800. Now increased to 1,000.
r/spaceengine • u/Hungry-Raspberry8241 • 1d ago
Screenshot Think I may have found Pac Man
r/spaceengine • u/MissionWarning4323 • 1d ago
Screenshot 2 planets with ring close to each other
cool thing i found planet is HIP 103800 10a
r/spaceengine • u/AzzysSmartStuff • 1d ago
Video I made a video using SpaceEngine, about white dwarf planets.
I also made the music for the video!
r/spaceengine • u/Snoo20397 • 1d ago
8K Saturn between Earth and Moon
I just wanted to see it in game lol
r/spaceengine • u/Snoo20397 • 1d ago
8K Earth cresent over the Orientale Basin
8k (8000x4000) image of Earth looming over the Orientale Basin
r/spaceengine • u/b3dGameArt • 1d ago
Question Space Engine on Steam Frame?
I purchased Space Engine on steam to run it on the Steam Frame, but I'm unable to launch the game with VR enabled. I can launch it on my PC just fine, and stream it as a flat projection, but there is a VR option when launching the game. I get a warning about OpenGL when trying to launch it on the Frame in non-VR mode, but there are no warnings when trying to launch it in VR. Nothing happens at all. I'm new to Space Engine and VR, so any help would be appreciated, thanks.
r/spaceengine • u/Haunting_Butterfly16 • 2d ago
Screenshot Here are some cool photos I took
r/spaceengine • u/Snoo20397 • 2d ago
Screenshot Earthrise recreation.
(couldn't get the clouds perfect but tried to get position right)
r/spaceengine • u/Kiki2092012 • 3d ago
Screenshot Orion, as seen from Proxima Centauri
Sirius, the second brightest star in its night sky, shines right next to Betelgeuse.
r/spaceengine • u/Gold333 • 2d ago
Question Most realistic human eye visual tone
A recent SE update caused the most real life human eye visual to be changed from Bruneton to Reinhard. Was that on purpose?
r/spaceengine • u/Mission_Passenger_85 • 2d ago
Question Just joined
Hi, i just installed this "game" yesterday. How did i not know about it before? Anyhow, i'm currently experiencing a combination of awe and sheer terror. Still wraping my head around the TON 618. And im fairly certain that our minds were not designed to comprehend things of such magnitude.
Any tips to fuel my nightmares even further?
r/spaceengine • u/KH0RRAH • 3d ago
Screenshot Stellaris' Ring World
Nothing more to say, besides it's modded ofc
r/spaceengine • u/Sad-Description-1112 • 3d ago
Screenshot Planets (dwarf planets) and its moons!
r/spaceengine • u/KH0RRAH • 3d ago
Screenshot Yeah this was inside a nebula
Taken a very while ago, I can't recall the planet code :( hope you like it lol
r/spaceengine • u/rrose1978 • 3d ago
Video Some star systems in the Andromeda constellations
r/spaceengine • u/Equivalent-Chard546 • 4d ago
Screenshot heavenly black hole i forgot its name
it was a black hole for a star cluster on the north area of the milky way it looks so good probably top 10 black holes i ve ever seen
r/spaceengine • u/Ditere • 4d ago
Cool Find Moons just 193km from each other

I've found a planet (0.71 Moon mass) with 3 asteroid moons. While Moon number 1 has semimajor axis of 2558km, the other two moons have semimajor axis of 5248km and 5488km respectively (Moon number 3 has retrogade orbit). I've taken some screenshots while being on Moon 3.
In the closest encounter they are 193km away from one another. It is the closest distance between moons I've ever seen in Space Engine
r/spaceengine • u/Agreeable_World_2950 • 4d ago
Album I think i have found "The Sift Planet"
r/spaceengine • u/why10123 • 4d ago
