## v2
### Physically based soft shadows
* Replaced the fixed texel-radii PCSS heuristic with a physical penumbra:
the sun's angular radius (0.0093 radians, shared with the visible sun disc)
drives similar-triangle softening from the blocker's height, so shadows are
contact-sharp and widen with caster distance like real area-light shadows
* Converted filter radii from world units to local shadow-map texels through
the closed-form distortion derivative, so the same caster blurs the same
amount regardless of its position on the distorted map; depth and lateral
scale now read `shadowProjection` directly, adapting to resolution and
shadow-distance settings
* Added slope-scaled receiver bias derived from N·L and the local texel size,
replacing constant depth offsets that were tuned to one resolution
* Unified shadow-map projection across terrain, entities, native water, and DH
water through one shared receiver function with a world-space normal offset;
water glints and DH water glints previously projected with no receiver offset
* Derived the blocker search radius from the physical maximum penumbra and
clamped it to the filter-quality sample budget
### Underwater continuity
* Replaced the binary in-water switch with a continuous submersion factor:
the water composite and final pass probe the rendered, displaced water
surface above the camera and measure the eye's depth below it, ramping over
half a block
* The probe now also measures the plane from nearby water-surface pixels when
the straight-up view cannot see it, so level and downward views no longer
snap to the engine's binary flag while swimming or diving
* Water Fresnel, the refraction index flip, the surface's sky-reflection
weight, atmospheric-to-underwater fog handover, and the underwater wobble,
blur, and FXAA blend all interpolate by that factor, removing the hard pop
when diving and the flicker while swimming at the wave line
* Transmitted content below the surface switches to the refracted sky early
in the ramp instead of at its midpoint; an eye just under the surface now
sees the Snell window it physically should, without the dark band that
appeared between the window and the horizon after submerging
* Underwater volume integration follows the ray: upward rays stop at the
water-plane crossing, so above-water scenery seen during the ramp and sky
slivers at the shore no longer receive full-depth murk
* The engine's in-water flag only seeds the factor when no surface is visible
overhead, so eyes above a wave trough render the clean above-water view even
while the block state still reports submerged
* Water and Distant Horizons water sun glints hand over to the sky-lit
estimate at the shadow range, matching terrain, instead of cutting to zero;
the horizon keeps its sparkle
### Shared surface optics
* Replaced the separate highlight formulas with one GGX BRDF shared by
materials, water, glass, and puddles: Trowbridge-Reitz distribution,
height-correlated Smith visibility, and Schlick Fresnel, with a roughness
floor of 0.045 that broadens very sharp highlights to reduce aliasing; the
previous distribution clamp flattened polished highlights, and the water and
material paths mapped roughness differently
* Material direct diffuse weights by `(1 - metalness) * (1 - F)`, and
back-facing light or view directions return zero before constructing the half
vector
* Material reflectance keeps all three colour channels in an RGBA16F
`colortex8`, so authored conductors retain coloured reflectance including the
gold/iron distinction and HDR water highlights survive the buffer
* Reflection normals use octahedral encoding in the existing two channels;
reconstructing an always-positive view-space Z previously lost normals in the
opposite hemisphere
* Environment reflections use a polynomial fit to the correlated GGX
hemispherical integral offline, validated on 483 held-out angle and roughness
pairs; the fit adds no texture or runtime dependency and
preserves RGB conductor colour
* Only the sky-derived portion of metal ambient lighting gives up energy to
environment reflections; block light, held light, dimension lighting, and
ambient floors keep their material tint, so enabling reflections no longer
dims torch-lit metals
* Puddles use water Fresnel at the perturbed surface normal instead of a fixed
15% minimum plus a separate large reflection blend
* Transparent blending partitions reflection and body opacity before
converting to straight alpha (`F + (1 - F) * a`), so reflections keep their
full weight after blending instead of being reduced by alpha a second time
* Water uses unpolarized dielectric Fresnel at an index of refraction of 1.333
(normal-incidence reflectance about 0.0204), shared by native and Distant
Horizons water
### Deferred water and reflections
* Added a deferred pass that copies the opaque scene to `colortex9` before
translucent draws; the water composite reconstructs the surface from
`colortex3` markers and `colortex8` unattenuated direct specular light plus
skylight exposure, adding eight bytes per pixel per buffer set
* Submerged cameras now blend visible clouds into the scene and the snapshot
before water and other translucents draw; the former late cloud pass skipped
underwater views and left a cloud-free sky in the water background, and
`cloud_view.glsl` shares one visible cloud field between the air pass and the
underwater snapshot
* Rewrote SSR in `screen_trace.glsl` as interval tracing: rays clip to the near
plane and screen bounds, step along the dominant projected pixel axis, and
test the depth interval between adjacent samples instead of isolated points,
which previously let a ray step over a wall's depth slab; seven refinement
iterations and a final thickness check reject false hits, and the edge
fallback transition shrank from 28-32% of the screen to 6%
* SSR is now opt-in: every profile and the default settings compile it out,
and materials use sky-only reflections in Medium, High, and Ultra; reselect a
preset after updating to clear saved SSR settings
* SSR returns its fallback without tracing underwater, and its sky fallback
traces the same animated 3D cloud density and light attenuation as the visible
sky; cloud reflections in water use fewer samples and skip the cirrus layer
* Rebuilt water waves as four travelling components at 5.5, 2.3, 1.0, and 0.42
block wavelengths whose angular frequency follows deep-water dispersion;
normals use analytical height derivatives and the submerged underside opacity
follows a slope-weighted cue from the same phases
* Water refraction samples the deferred opaque snapshot at the original screen
coordinates; DH water now compares reconstructed native and DH positions for
occlusion, so native terrain behind water no longer erases the water face
while native foreground still occludes it, and the distance-only alpha fade
that left gaps when native water was absent is gone
* Outdoor light shafts use visible sky depth as their source, so bright opaque
walls no longer count as sky, and underwater light shafts are disabled
* DH terrain keeps its supplied average texture colour instead of adding
world-space material noise and a second desaturation pass, and the separate
white metal glint is removed; native and DH surfaces share one fog distance
law, and only cleared depth 1.0 counts as sky
### Glass and generated materials
* Glass defaults to F0 0.04 and smoothness 0.90 instead of inheriting the
polished-block material; its sky fallback excludes the solar disc, and texture
detail uses ambient lighting, removing a broad coloured wash on sun-facing
panes
* Coloured sunlight transmitted through glass onto nearby surfaces now uses an
opacity-weighted tint, `(1 - opacity) + opacity * textureColour`, instead of a
fixed 90% tint and 1.6 saturation boost
* The shadow colour target now carries caster opacity and reserves alpha code
255 for water; only tagged water applies animated caustic modulation, so
moving bright stripes no longer show through glass, and translucent casters
join the blocker search so their distance controls penumbra size
* Generated vanilla metal textures keep their diffuse body and use F0 0.04
with smoothness 0.60 (Natural) or 0.72 (Pronounced) instead of being treated
as full conductors whose sky-only reflection dominated unrepresented
surroundings; authored LabPBR conductors keep supplied metalness and
reflectance
* Held and dropped block items resolve the same material classes as placed
blocks through `currentRenderedItemId`, sample terrain shadows and cloud
visibility instead of bypassing the shadow map, and clear their reflection
metadata so the world cannot reflect through the hand
* Added steep-parallax occlusion against the LabPBR height field; flat maps
(alpha 255 everywhere, the default when a pack omits height) return on the
first probe and pay no march cost
### Clouds, sun, and night sky
* Replaced 2D noise slices with continuous 3D value noise for cloud billows
and erosion; density now varies in all three dimensions and the flat alto
layer is removed, leaving one thin cirrus layer
* Cloud RGB and opacity share one exponential integration instead of an
opacity-only power adjustment; each occupied sample probes density three times
along the light direction with Beer-Lambert transmission and a two-lobe
Henyey-Greenstein phase approximation
* The sun is an antialiased disc at HDR intensity 24 with the 0.0093-radian
angular radius shared with shadow penumbra construction, plus a separate
angular halo so it stays visible through the tone curve
* Night sky uses a continuous horizon-to-zenith gradient independent of the
engine's sky-mesh vertex colours and dims with weather; moonlight now varies
with moon phase and ambient lighting is less blue
* The Milky Way is fainter with a smooth band structure, and stars use Iris's
star render stage (`MC_RENDER_STAGE_STARS`) instead of guessing from grayscale
vertex colours
### Performance
* Fused FXAA and contrast-adaptive sharpening into one pass sharing a single
3x3 neighbourhood, roughly halving full-resolution fetches for those effects;
the fusion reproduces the previous two-pass output
Optional dependencies
Iris Shaders
Any compatible version
Developer information
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle.
maven { name = "Modrinth"; url = "https://api.modrinth.com/maven" }