Aurora Sunsetoffline download file
IrisOptiFineWorks offline
EVERYTHING IS INSIDE THIS ONE FILE

Golden-hour water & violet skies

Both .zip packs — and every single file in them — are already embedded in this HTML page. Save this page once, keep it anywhere (Desktop, USB stick, email), and download the packs whenever you like. No internet needed. No Python. Nothing to install.

How it works: each button below is a normal link with the file packed inside it. One click → the file lands in your Downloads folder. Works even with JavaScript turned off.
Nothing happens when you click? You are probably viewing this inside a preview window. Try: right-click a button → “Save link as…” — or open this page in a real browser tab — or save this file (Ctrl+S / Cmd+S) and double-click it from your Desktop.

Sky previews

Rendered from the exact constants shipped in the GLSL — sky gradient → ACES tonemap → vibrance → vignette. These are the real values your sky will use, not mockups. Blocks stay 100% vanilla in every dimension.

Live sky explorer

Drag the time — the canvas runs the pack's actual GLSL sky math right here in the page: sky gradient, the three-lobed sunset glow, dusk grade, ACES tonemap and vignette, straight from the shipped constants. In game: /time set (value).

18:12 Golden hour Zenith Horizon Sun
06:00 · 012:00 · 600018:00 · 1200000:00 · 1800006:00 · 24000
Shader Pack · Iris & OptiFine

Aurora Sunset — Shader Pack

Signature three-lobed sunset sun, mirror water with sparkling golden glints, violet dusk skies — plus a blood-red Nether sky and a blue-black End sky. Blocks are 100% vanilla: the shader contains zero block-lighting code, so terrain renders pixel-identical to Minecraft without shaders.

  • GLSL 120
  • Iris + OptiFine
  • No shadow maps (fast)
  • Blocks 100% vanilla
  • Nether + End skies
⬇  AuroraSunset-Shaderpack.zip ✓ Saved to Downloads
AuroraSunset-Shaderpack.zip · 33.2 KB
Resource Pack · Java Edition

Aurora Sunset — Resource Pack

Soft radial golden sun, 8 violet moon phases, 32-frame animated calm water (biome-tint safe). Pairs with the shader pack; also fine standalone.

  • 32-frame water
  • Biome-tint safe
  • All 8 moon phases
⬇  AuroraSunset-Resources.zip ✓ Saved to Downloads
AuroraSunset-Resources.zip · 49.5 KB
📁 Shader pack files 36 files embedded · click a file name to read it

Every GLSL file, config and README from the shader pack — click any file name to read it right here, or save it individually with the ⬇ button.

README.md9.0 KB
# Aurora Sunset

A stylized, performance-friendly shader pack for **Minecraft** with
**Iris Shaders** (Fabric/Quilt/NeoForge) or **OptiFine**.

Tuned to the target screenshot ("violet mirror sunset"): a huge ember-gold
glow flooding half the sky around the low sun, violet-indigo zenith fading
through orchid/mauve into a peach horizon, dreamy distance haze that melts
mid-range terrain into gold mist, pink-lit clouds, and water that mirrors
all of it — orchid-pink surface, long sparkling golden light path.

## Features

- **The big sunset glow** — three-lobe sun glow (wide flood + halo + hot
  core) centered on the real sun direction; bloom turns it into the soft
  dreamy halo from the screenshot
- Calm **mirror-style water** — 10+ block swell plus two gentle
  near-camera wavelet octaves that fade out with distance, so close water
  sparkles and far water is a clean shimmer-free mirror. Stylized Fresnel
  keeps it sky-reflective at every viewing angle; the golden sun path and
  its wide hot trail appear automatically at dusk
- Hand-authored **sunset sky gradient** — 4-stop dusk palette (violet ->
  orchid -> peach -> molten gold toward the sun), day / dusk / night
  blending, sun-azimuth warm band, moon halo, rain desaturation
- **Dreamy atmosphere** — exponential distance haze that starts early and
  thickens looking toward the sun (forward scattering); far terrain melts
  into the violet haze while near blocks stay untouched
- **100% vanilla blocks** — terrain, plants, leaves, mobs, particles and
  glass are shaded ONLY by the vanilla lightmap (`texture × gl_Color ×
  lightmap`). The pack contains ZERO block-lighting code: no directional
  sun term, no rim glow, no ambient recolor, no saturation lift, no
  specular — block surfaces are pixel-identical to Minecraft without
  shaders. All color lives in the sky, water, fog and post grade
- Time-aware **sunset color grade** + 20-tap spiral **bloom** (thresholded
  above the brightest possible block, so terrain can never halo) + filmic
  **tone mapping** + dithering (no gradient banding)
- **Pink-lit clouds** — rose-pink tint at dusk with sun-side flushing
- **Nether & End included** — the Nether gets its own blood-red sky with
  crimson ember haze; the End gets a deep blue-black void gradient with
  cold dark-blue fog. Both dimensions skip the overworld sunset grade,
  and blocks stay vanilla everywhere (vanilla lightmap in all dims)
- **No shadow maps** — vanilla face shading & AO are kept, the entire
  shadow pass is skipped. Runs great on low-end GPUs and integrated graphics.
- In-game options (Shader Options screen): wave height/speed/detail,
  sunset strength, fog, bloom, exposure, saturation, vignette

## Install

1. Drop `AuroraSunset.zip` into `.minecraft/shaderpacks/`
   (or the folder, if unzipped — it just needs `shaders/` at its root)
2. Options -> Video Settings -> Shader Packs -> select **AuroraSunset**
3. For the full mood, set time to roughly 17:30–19:00 in-game (`/time set 12200`)

## File map

```
shaders/
├── shaders.properties        pack config + in-game options screen
├── block.properties          block ID map (water -> 10001)
├── lib/
│   ├── common.glsl           shared uniforms + helpers
│   ├── settings.glsl         all tweakable defines
│   ├── sky.glsl              sky gradient / light colors / fog color
│   ├── lighting.glsl         distance haze ONLY (blocks use vanilla lightmap)
│   └── water.glsl            sine wave height / gradient / normals
├── gbuffers_water.vsh/.fsh   ★ water waves, color, reflections
├── gbuffers_terrain.*        world geometry
├── gbuffers_textured.*       particles & fallbacks
├── gbuffers_entities.*       mobs
├── gbuffers_skybasic.*       stylized sky gradient + stars
├── gbuffers_skytextured.*    sun & moon
├── gbuffers_clouds.*         vanilla fancy clouds
├── composite.vsh/.fsh        sunset grade, bloom, tonemap (+ TAA hook)
├── final.vsh/.fsh            dithering
├── world-1/                  NETHER: red sky dome, crimson fog, neutral post
│   └── lib/sky.glsl          dimension palette (overrides overworld sky)
└── world1/                   END: blue-black sky, dark-blue fog, neutral post
    └── lib/sky.glsl          dimension palette (overrides overworld sky)
```

## DLSS-style upscaling / TAA

Hooks are pre-placed and marked with big comment banners:

- `[TAA] INTEGRATION POINT #1` — projection jitter in the gbuffers vertex
  shaders (`gbuffers_water.vsh`, `gbuffers_terrain.vsh`)
- `[TAA] INTEGRATION POINT #2` — temporal resolve in `composite.fsh`
- Commented `size.buffer` lines in `shaders.properties`

The pipeline is intentionally left OFF so the pack runs everywhere out of
the box; follow the three-step recipe in the comments to enable it.

## Water: the mirror recipe

`gbuffers_water.fsh` composites the surface as:

```
color = mix(waterBodyColor, skyReflection, fresnel) + glints
```

- **Fresnel** starts at 0.42 even when looking straight down and rises to
  a full mirror at grazing angles (`mix(0.42, 1.0, pow(1-cosV, 1.5))`) —
  this is what makes the water feel like the screenshot.
- A **wide hot-path boost** floods the reflection with ember gold wherever
  the reflected ray points loosely at the sun — that is the long sparkly
  light trail.
- **Normals fade to flat** with distance (`exp(-dist*0.012)`), so far
  water is a clean mirror with zero shimmer.
- Waves: big calm swell (10+ block wavelengths) + two near-camera wavelet
  octaves (~2.7 / ~3.4 blocks); raising `WAVE_DETAIL` past ~1.5
  reintroduces busy detail.

## Notes & tuning

| Want                    | Change                                    |
| ----------------------- | ----------------------------------------- |
| Bigger waves            | `WAVE_HEIGHT` (0.45 -> 1.0+)               |
| Stronger golden path    | `WATER_REFLECTIVITY` up; dusk `SUNSET_STRENGTH` up |
| Calmer / busier surface | `WAVE_DETAIL` down (0.5) / up (1.5 max)    |
| Flatter mirror          | `WAVE_HEIGHT` + `WAVE_DETAIL` down         |
| Pinker / weaker dusk    | `SUNSET_STRENGTH` 1.5+ / 0.75              |
| Denser horizon haze     | `FOG_DENSITY` 1.5–2.5                      |
| Dreamier glow           | `BLOOM_STRENGTH` 1.1–1.4                   |
| More/less "pop"         | `EXPOSURE`, `SATURATION`                   |

## Version 4 — "Vanilla Blocks" + dimension skies

- REMOVED from the pack entirely: directional sun shading on blocks,
  dusk rim / edge glow, custom ambient recolor, saturation lift
- `gbuffers_terrain.fsh`, `gbuffers_entities.fsh`, `gbuffers_textured.fsh`
  and the glass branch of `gbuffers_water.fsh` now render
  `texture × gl_Color × vanilla lightmap` — pixel-identical to no-shader
  Minecraft, guaranteed by construction (there is no lighting code left
  to tune or mis-tune)
- `lib/lighting.glsl`: contains the distance haze ONLY
- `composite.fsh`: bloom bright-pass threshold 1.02 — above the brightest
  possible lit block (~0.95), so terrain can never bloom or halo; softer
  cream highlight grade
- Sliders removed (the settings no longer exist): the directional
  sun-shading depth slider, the rim-light slider and the terrain
  saturation slider. Shader Options now only offers wave / water /
  sunset / fog / exposure / bloom / saturation / vignette
- `FOG_DENSITY` gained a `0.00` option for absolutely clear air
- Dimension folders added: `world-1/` (Nether — blood-red sky, crimson
  ember fog, neutral post without the sunset grade) and `world1/` (End —
  blue-black void sky, dark-blue fog, neutral post). Per-file dimension
  fallback means blocks/water/sun/moon come from the overworld set
  UNCHANGED; only sky/fog colors are dimension-specific
- Unchanged on purpose: three-lobed sun glow, violet dusk sky palette,
  mirror water with golden glint path, clouds, fog, post grade

## Version 3 — "Violet Mirror" (screenshot match)

- `lib/sky.glsl`: rebuilt dusk palette (violet-indigo zenith, orchid mid,
  peach horizon), sun-azimuth molten band, 3-lobe giant glow, wider dusk
  time window
- `lib/lighting.glsl`: exponential haze (starts ~1/3 of render distance,
  sun-side forward scattering), darker dusk ambient for silhouettes
- `gbuffers_water.fsh`: stronger Fresnel mirror, wide golden hot path,
  layered glints, violet-ink dusk body color
- `lib/water.glsl`: two gentle near-camera wavelet octaves (distance-faded)
- `gbuffers_clouds.fsh`: rose-pink dusk clouds with sun-side flushing
- `gbuffers_skytextured.fsh`: ember-gold sun disc / violet-silver moon tint
- `composite.fsh`: 20-tap bloom (lower threshold, wider radius), stronger
  violet/gold grade
- Defaults: `SUNSET_STRENGTH 1.25`, `FOG_DENSITY 1.50`,
  `WATER_REFLECTIVITY 1.20`, `BLOOM_STRENGTH 0.85`, `EXPOSURE 1.18`

- On very old OptiFine builds, rename `gtexture` to `texture` in the
  gbuffers fragment shaders.
- Water uses `mc_Entity` + `block.properties`; both Iris and OptiFine G8+
  support this. If waves ever fail to appear, check that mapping first.

## License

CC0 — do whatever you want. Credit appreciated but not required.
⬇ Save
shaders/block.properties1.4 KB
# Block ID map (mc_Entity.x).
# gbuffers_water uses block.10001 to detect WATER for the stylized
# mirror/glint path. Since the vanilla-blocks update the terrain pass
# no longer reads IDs (blocks are vanilla lightmap) — the other groups
# are kept documented and reserved for future use.

# water & flowing water — the stylized violet-mirror surface
block.10001=minecraft:water minecraft:flowing_water

# leaves (reserved)
block.10002=minecraft:oak_leaves minecraft:spruce_leaves minecraft:birch_leaves minecraft:jungle_leaves minecraft:acacia_leaves minecraft:dark_oak_leaves minecraft:mangrove_leaves minecraft:cherry_leaves minecraft:azalea_leaves minecraft:flowering_azalea_leaves

# all cross-model plants (reserved — matte vanilla by design)
block.10003=minecraft:short_grass minecraft:tall_grass minecraft:fern minecraft:large_fern minecraft:dandelion minecraft:poppy minecraft:blue_orchid minecraft:allium minecraft:azure_bluet minecraft:red_tulip minecraft:orange_tulip minecraft:white_tulip minecraft:pink_tulip minecraft:oxeye_daisy minecraft:cornflower minecraft:lily_of_the_valley minecraft:wither_rose minecraft:dead_bush minecraft:sunflower minecraft:lilac minecraft:rose_bush minecraft:peony minecraft:torchflower

# sand (reserved — matte vanilla by design)
block.10004=minecraft:sand minecraft:red_sand

# snow (reserved — matte vanilla by design)
block.10005=minecraft:snow minecraft:snow_block
⬇ Save
shaders/composite.fsh4.3 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    ============================================================
    AURORA SUNSET — composite.fsh
    ------------------------------------------------------------
    Post-processing chain:

      1. [TAA / DLSS-STYLE UPSCALING — INTEGRATION POINT #2]
      2. sunset lighting blend (time-aware violet/gold grade)
      3. cheap 20-tap golden-spiral bloom (soft glowy look)
      4. vibrance + filmic tone mapping + soft contrast
      5. vignette

    (final.fsh adds dithering to kill gradient banding)
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"

uniform sampler2D colortex0;   // the scene (= gcolor)

varying vec2 v_tex;

vec3 aces(vec3 x) {
    return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
}

void main() {
    vec3 color = texture2D(colortex0, v_tex).rgb;

    /* ============================================================
       [TAA / DLSS-STYLE UPSCALING — INTEGRATION POINT #2]

       To simulate DLSS (render low-res -> temporally upscale):

       shaders.properties:
           size.buffer.colortex0=0.5 0.5    // scene at 50% res
           size.buffer.colortex1=1.0 1.0    // full-res output
           size.buffer.colortex2=1.0 1.0    // TAA history

       here, replace the fetch above with a temporal resolve:

           // 3x3 neighborhood clamp kills ghosting
           vec3 mn = vec3( 9.0), mx = vec3(-9.0);
           for (int px = -1; px <= 1; px++)
           for (int py = -1; py <= 1; py++) {
               vec3 s = texture2D(colortex0,
                   v_tex + vec2(px, py) * 0.5 / vec2(viewWidth, viewHeight)).rgb;
               mn = min(mn, s); mx = max(mx, s);
           }
           vec3 curr = clamp(color, mn, mx);
           vec3 hist = texture2D(colortex2, v_tex).rgb;
           color     = mix(hist, curr, 0.10);   // temporal accumulation

       then write to colortex1 (change DRAWBUFFERS to :1) and copy
       colortex1 -> colortex2 in a follow-up composite pass.
       Enable the matching jitter block [INTEGRATION POINT #1] in
       gbuffers_water.vsh / gbuffers_terrain.vsh.
       ============================================================ */

    /* underwater cast */
    if (isEyeInWater == 1) color *= vec3(0.55, 0.80, 0.95);

    /* ---------------- sunset lighting blend ---------------- */
    float sunH  = sin(sunAngle * TAU);
    float duskF = 1.0 - smoothstep(0.00, 0.32, abs(sunH));
    float grade = mix(0.30, 1.00, duskF) * (1.0 - rainStrength * 0.8);

    float l   = luma(color);
    vec3 tint = mix(vec3(0.86, 0.80, 1.12),                 // shadows -> violet
                    vec3(1.03, 0.99, 0.93),                 // highlights -> soft cream
                    smoothstep(0.15, 0.85, l));
    color *= mix(vec3(1.0), tint, grade);

    /* ---------------- bloom (20-tap golden spiral) ---------------- */
    const int   TAPS   = 20;
    const float RADIUS = 0.016;
    vec3 bloom = vec3(0.0);
    for (int i = 0; i < TAPS; i++) {
        float fi  = float(i);
        float ang = fi * 2.39996323;                      // golden angle
        float r   = sqrt((fi + 0.5) / float(TAPS)) * RADIUS;
        vec2 off  = clamp(v_tex + vec2(cos(ang), sin(ang) * aspectRatio) * r,
                          vec2(0.001), vec2(0.999));
        vec3 s    = texture2D(colortex0, off).rgb;
        bloom    += max(s - vec3(1.02), vec3(0.0));      // bright pass: block-safe
    }
    bloom /= float(TAPS);
    // bright pass threshold 1.02 — brighter than ANY vanilla-lit block
    // can ever reach (whitest block x full lightmap ~ 0.95), so terrain
    // can never bloom or halo. Only the sun halo, bright sky cores and
    // the water glint path feed the bloom.
    color += bloom * BLOOM_STRENGTH * 1.9;

    /* ---------------- tone map + soft contrast + vibrance ----------------
       Vibrance runs AFTER the tonemap so the lush greens survive ACES
       instead of being washed back to pastel. */
    color = aces(color * EXPOSURE);
    color = mix(color, color * color * (3.0 - 2.0 * color), 0.30);
    color = mix(vec3(luma(color)), color, SATURATION);

    /* ---------------- vignette ---------------- */
    vec2 q = v_tex - 0.5;
    color *= 1.0 - dot(q, q) * VIGNETTE_STRENGTH * 2.0;

    gl_FragData[0] = vec4(color, 1.0);
}
⬇ Save
shaders/composite.vsh212 B
#version 120

/*  AURORA SUNSET — composite.vsh (fullscreen pass-through quad) */

varying vec2 v_tex;

void main() {
    gl_Position = ftransform();
    v_tex = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
}
⬇ Save
shaders/final.fsh452 B
#version 120

/*
    AURORA SUNSET — final.fsh
    Last stop before the screen: animated dither kills banding in
    the smooth sunset gradients.
*/

#include "/lib/common.glsl"

uniform sampler2D colortex0;

varying vec2 v_tex;

void main() {
    vec3 color = texture2D(colortex0, v_tex).rgb;

    float d = hash12(gl_FragCoord.xy + fract(frameTimeCounter) * 100.0);
    color += (d - 0.5) * (1.5 / 255.0);

    gl_FragData[0] = vec4(color, 1.0);
}
⬇ Save
shaders/final.vsh208 B
#version 120

/*  AURORA SUNSET — final.vsh (fullscreen pass-through quad) */

varying vec2 v_tex;

void main() {
    gl_Position = ftransform();
    v_tex = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
}
⬇ Save
shaders/gbuffers_clouds.fsh1.7 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    ============================================================
    AURORA SUNSET — gbuffers_clouds.fsh
    ------------------------------------------------------------
    Clouds styled to the target screenshot: lavender-white and
    lit from the sun side at dusk, soft violet at night, and they
    melt into the sky haze with distance.
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"
#include "/lib/lighting.glsl"

uniform sampler2D gtexture;

varying vec2 v_tex;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    vec4 tex = texture2D(gtexture, v_tex);

    vec3 sunDirW  = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 viewDirW = normalize(v_playerPos);
    vec3 w        = skyTimeWeights(sunDirW.y);

    vec3 color = tex.rgb * v_color.rgb;

    /* palette tint per time of day (blended gently over vanilla) */
    vec3 cloudTint = vec3(1.02, 0.99, 1.03) * w.x        /* day: white           */
                   + vec3(1.06, 0.90, 1.02) * w.y        /* dusk: lavender-white */
                   + vec3(0.32, 0.36, 0.52) * w.z;       /* night: dim           */
    color *= mix(vec3(1.0), cloudTint, 0.70);

    /* sun-side brightening: clouds flush cream looking toward the sun */
    float sunSide = pow(max(dot(viewDirW, sunDirW), 0.0), 3.0);
    color += vec3(1.22, 0.94, 0.68) * sunSide * w.y * 0.40;

    /* slight translucency boost at dusk so clouds feel airy */
    float alpha = tex.a * v_color.a * mix(1.0, 0.90, w.y);

    color = applyDistanceFog(color, viewDirW, sunDirW, w, v_playerPos);

    gl_FragData[0] = vec4(color, alpha);
}
⬇ Save
shaders/gbuffers_clouds.vsh486 B
#version 120

/*
    AURORA SUNSET — gbuffers_clouds.vsh
    Vanilla fancy clouds (clouds=fancy in shaders.properties).
*/

#include "/lib/common.glsl"

varying vec2 v_tex;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    v_tex   = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
    v_color = gl_Color;

    vec4 viewPos = gl_ModelViewMatrix * gl_Vertex;
    v_playerPos  = (gbufferModelViewInverse * viewPos).xyz;

    gl_Position = gl_ProjectionMatrix * viewPos;
}
⬇ Save
shaders/gbuffers_entities.fsh1.3 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    AURORA SUNSET — gbuffers_entities.fsh
    Mobs & entities — VANILLA LIGHTING, matching the blocks:
    texture * gl_Color * vanilla lightmap, plus the vanilla
    hurt-flash tint. No rim, no sun modeling, no polish —
    entities light exactly like they do in vanilla Minecraft.
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"
#include "/lib/lighting.glsl"

uniform sampler2D gtexture;
uniform sampler2D lightmap;
uniform vec4 entityColor;      // hurt flash / creeper charge tint

varying vec2 v_tex;
varying vec2 v_lm;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    vec4 tex = texture2D(gtexture, v_tex);
    if (tex.a < 0.102) discard;

    /* vanilla color + vanilla hurt-flash tint */
    vec3 albedo = tex.rgb * v_color.rgb;
    albedo = mix(albedo, entityColor.rgb, entityColor.a);

    /* vanilla lightmap — zero custom lighting */
    vec3 color = albedo * texture2D(lightmap, v_lm).rgb;

    vec3 sunDirW  = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 viewDirW = normalize(v_playerPos);
    vec3 w        = skyTimeWeights(sunDirW.y);
    color = applyDistanceFog(color, viewDirW, sunDirW, w, v_playerPos);

    gl_FragData[0] = vec4(color, tex.a);
}
⬇ Save
shaders/gbuffers_entities.vsh686 B
#version 120

/*
    AURORA SUNSET — gbuffers_entities.vsh
    Mobs, item frames, armor stands... Lighting is VANILLA
    (lightmap multiply in the fragment stage), so only texture/
    lightmap coords, vertex color and position are needed.
*/

#include "/lib/common.glsl"

varying vec2 v_tex;
varying vec2 v_lm;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    v_tex   = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
    v_lm    = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy;
    v_color = gl_Color;

    vec4 viewPos = gl_ModelViewMatrix * gl_Vertex;
    v_playerPos  = (gbufferModelViewInverse * viewPos).xyz;

    gl_Position = gl_ProjectionMatrix * viewPos;
}
⬇ Save
shaders/gbuffers_skybasic.fsh1.0 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    AURORA SUNSET — gbuffers_skybasic.fsh
    Replaces the flat vanilla sky with the stylized time-of-day
    gradient from lib/sky.glsl. Stars (which vanilla feeds through
    this program as small grayscale quads) are detected & kept,
    with a cheap twinkle.
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"

varying vec3 v_dir;

void main() {
    vec3 dir  = normalize(v_dir);
    vec4 vcol = gl_Color;

    /* stars arrive as neutral-gray quads — keep them */
    float neutrality = abs(vcol.r - vcol.g) + abs(vcol.g - vcol.b);
    if (neutrality < 0.02 && vcol.r > 0.04 && dir.y > -0.05) {
        float tw = 0.75 + 0.25 * sin(frameTimeCounter * 3.0
                   + hash12(dir.xz * 512.0) * TAU);
        gl_FragData[0] = vec4(vec3(0.90, 0.93, 1.00) * tw, 1.0);
        return;
    }

    vec3 sunDirW = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 w = skyTimeWeights(sunDirW.y);

    gl_FragData[0] = vec4(skyGradient(dir, sunDirW, w), 1.0);
}
⬇ Save
shaders/gbuffers_skybasic.vsh334 B
#version 120

/*
    AURORA SUNSET — gbuffers_skybasic.vsh
    Vanilla sky dome / void plane / stars.
*/

#include "/lib/common.glsl"

varying vec3 v_dir;    // world-space direction from the camera

void main() {
    gl_Position = ftransform();
    v_dir = mat3Of(gbufferModelViewInverse) * (gl_ModelViewMatrix * gl_Vertex).xyz;
}
⬇ Save
shaders/gbuffers_skytextured.fsh1.2 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    ============================================================
    AURORA SUNSET — gbuffers_skytextured.fsh
    ------------------------------------------------------------
    Sun & moon quads. The disc is enriched at dusk (deeper amber)
    so it melts into the big skyGradient glow. The huge soft halo
    around the sun comes from skyGradient() + bloom, and the soft
    radial sun TEXTURE comes from the Aurora Sunset resource pack.
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"

uniform sampler2D gtexture;

varying vec2 v_tex;

void main() {
    vec4 tex = texture2D(gtexture, v_tex);

    vec3 sunDirW = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 w       = skyTimeWeights(sunDirW.y);

    /* dusk: deepen the disc toward ember-gold so it fuses with the glow */
    vec3 tint = mix(vec3(1.0), vec3(1.28, 0.86, 0.58), w.y);
    /* night: cool the moon toward violet-silver */
    tint = mix(tint, vec3(0.88, 0.90, 1.12), w.z * 0.6);

    gl_FragData[0] = vec4(tex.rgb * gl_Color.rgb * tint, tex.a * gl_Color.a);
}
⬇ Save
shaders/gbuffers_skytextured.vsh246 B
#version 120

/*
    AURORA SUNSET — gbuffers_skytextured.vsh
    Sun & moon quads.
*/

#include "/lib/common.glsl"

varying vec2 v_tex;

void main() {
    gl_Position = ftransform();
    v_tex = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
}
⬇ Save
shaders/gbuffers_terrain.fsh2.0 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    ============================================================
    AURORA SUNSET — gbuffers_terrain.fsh
    ------------------------------------------------------------
    VANILLA BLOCK LIGHTING — GUARANTEED, BY CONSTRUCTION.

    There is NO lighting code for blocks in this shader:

      * no directional sun shading
      * no rim / edge glow
      * no ambient recoloring
      * no saturation lift
      * no specular / gloss (no such code exists in the pack)

    Blocks are colored exactly like vanilla Minecraft:

        texture  *  gl_Color  *  vanilla lightmap

    gl_Color already carries biome tint + AO + vanilla face
    shading (oldLighting=true), and the lightmap sampler is
    the same gradient texture the vanilla pipeline uses, so
    the result is pixel-identical to no-shader Minecraft.
    Only the violet dusk FOG far from the camera is ours —
    it belongs to the sky, not to block surfaces.
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"
#include "/lib/lighting.glsl"

uniform sampler2D gtexture;
uniform sampler2D lightmap;

varying vec2 v_tex;
varying vec2 v_lm;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    vec4 tex = texture2D(gtexture, v_tex);
    if (tex.a < 0.102) discard;                       // vanilla-style cutout

    /* vanilla color: texture * biome tint * AO * face shading */
    vec3 albedo = tex.rgb * v_color.rgb;

    /* vanilla lightmap: torch warmth, cave darkness, night blue —
       pixel-identical to Minecraft without shaders */
    vec3 color = albedo * texture2D(lightmap, v_lm).rgb;

    /* violet dusk haze melts far terrain into the sky */
    vec3 sunDirW  = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 viewDirW = normalize(v_playerPos);
    vec3 w        = skyTimeWeights(sunDirW.y);
    color = applyDistanceFog(color, viewDirW, sunDirW, w, v_playerPos);

    gl_FragData[0] = vec4(color, tex.a);
}
⬇ Save
shaders/gbuffers_terrain.vsh885 B
#version 120

/*
    AURORA SUNSET — gbuffers_terrain.vsh
    Solid + cutout world geometry (block entities fall back here).
    Lighting is VANILLA (lightmap multiply in the fragment stage),
    so only texture/lightmap coords, vertex color and position are
    passed — nothing else is needed.
*/

#include "/lib/common.glsl"

varying vec2 v_tex;
varying vec2 v_lm;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    v_tex   = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
    v_lm    = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy;
    v_color = gl_Color;

    vec4 viewPos = gl_ModelViewMatrix * gl_Vertex;
    v_playerPos  = (gbufferModelViewInverse * viewPos).xyz;

    /* [TAA] INTEGRATION POINT #1 — apply the same projection jitter
       shown in gbuffers_water.vsh here when upscaling is enabled. */

    gl_Position = gl_ProjectionMatrix * viewPos;
}
⬇ Save
shaders/gbuffers_textured.fsh1004 B
#version 120
/* DRAWBUFFERS:0 */

/*
    AURORA SUNSET — gbuffers_textured.fsh
    Particles & misc textured geometry (fallback for weather,
    hand and beacon beams). VANILLA lightmap lighting — no
    custom lighting of any kind.
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"
#include "/lib/lighting.glsl"

uniform sampler2D gtexture;
uniform sampler2D lightmap;

varying vec2 v_tex;
varying vec2 v_lm;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    vec4 tex = texture2D(gtexture, v_tex);

    vec3 sunDirW  = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 viewDirW = normalize(v_playerPos);
    vec3 w        = skyTimeWeights(sunDirW.y);

    /* vanilla lightmap — particles/weather light exactly like vanilla */
    vec3 color = tex.rgb * v_color.rgb * texture2D(lightmap, v_lm).rgb;
    color = applyDistanceFog(color, viewDirW, sunDirW, w, v_playerPos);

    gl_FragData[0] = vec4(color, tex.a * v_color.a);
}
⬇ Save
shaders/gbuffers_textured.vsh591 B
#version 120

/*
    AURORA SUNSET — gbuffers_textured.vsh
    Particles & misc textured geometry (fallback for weather,
    hand, beacon beams).
*/

#include "/lib/common.glsl"

varying vec2 v_tex;
varying vec2 v_lm;
varying vec4 v_color;
varying vec3 v_playerPos;

void main() {
    v_tex   = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
    v_lm    = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy;
    v_color = gl_Color;

    vec4 viewPos = gl_ModelViewMatrix * gl_Vertex;
    v_playerPos  = (gbufferModelViewInverse * viewPos).xyz;

    gl_Position = gl_ProjectionMatrix * viewPos;
}
⬇ Save
shaders/gbuffers_water.fsh4.9 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    ============================================================
    AURORA SUNSET — gbuffers_water.fsh
    ------------------------------------------------------------
    Fragment stage for water (and other translucent geometry).

    Water recipe ("violet mirror", tuned to the target screenshot):
      * reflects the SAME skyGradient() the sky uses -> the water
        turns lavender-pink at dusk and carries the cream light path
      * stylized Fresnel leans mirror-like at ALL angles
      * extra wide hot-path boost where the reflected ray points
        at the sun -> the long sparkly golden trail
      * layered Blinn-Phong glints (sparkle / path / sheen)
      * violet-ink body color at dusk, teal by day
      * near-camera wavelets fade with distance -> far water is a
        clean shimmer-free mirror
      * distance melt into the sunset haze
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"
#include "/lib/water.glsl"
#include "/lib/lighting.glsl"

uniform sampler2D gtexture;    // use "texture" on very old OptiFine builds
uniform sampler2D lightmap;

varying vec2  v_tex;
varying vec2  v_lm;
varying vec4  v_color;
varying vec3  v_playerPos;
varying float v_isWater;

void main() {
    vec4 tex = texture2D(gtexture, v_tex);

    vec3  sunDirW  = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3  viewDirW = normalize(v_playerPos);          // camera -> fragment
    vec3  w        = skyTimeWeights(sunDirW.y);
    float dist     = length(v_playerPos);

    vec3  color;
    float alpha;

    if (v_isWater > 0.5) {
        /* ------------- stylized water — violet mirror ------------- */

        vec2 wp = (v_playerPos + cameraPosition).xz;

        // wave normal — wavelets melt into a perfect mirror with
        // distance (no far shimmer, no tiled pattern)
        float nFade = exp(-dist * 0.012);
        vec3  N = normalize(mix(vec3(0.0, 1.0, 0.0), waterWaveNormal(wp), nFade));

        // Stylized Fresnel — the surface leans mirror-like at EVERY
        // angle, like the screenshot: looking down stays translucent
        // violet-teal, looking across becomes a full sky mirror.
        // At dusk the mirror leans even harder (reference look).
        float cosV    = max(dot(-viewDirW, N), 0.0);
        float fresBase = mix(0.42, 0.58, w.y);
        float fresnel = clamp(mix(fresBase, 1.0, pow(1.0 - cosV, 1.5)) * WATER_REFLECTIVITY, 0.0, 1.0);

        // sky reflection: same palette as the sky itself, so the
        // lavender-pink sky and the golden sun path appear automatically
        vec3 R = reflect(viewDirW, N);
        R.y = max(R.y, 0.03);                       // never reflect the void
        vec3 reflection = skyGradient(normalize(R), sunDirW, w) * 1.06;

        // wide hot-path boost: where the reflected ray points even
        // loosely at the sun, flood it with ember gold
        vec3  LC      = sunLightColor(w);
        reflection   += LC * pow(max(dot(normalize(R), sunDirW), 0.0), 5.0)
                             * (0.30 * w.y + 0.10 * w.x);

        // water body color — teal by day, violet-blue ink at dusk (pastel
        // mirror: the pink/cream comes from the sky reflection above it),
        // near-black at night
        vec3 deepCol = vec3(0.035, 0.27, 0.40) * w.x
                     + vec3(0.16, 0.14, 0.42) * w.y
                     + vec3(0.010, 0.020, 0.055) * w.z;
        deepCol *= 0.35 + 0.65 * v_lm.y;
        deepCol += vec3(1.00, 0.58, 0.26) * pow(v_lm.x, 3.0) * 0.45;

        // gentle stylized crest definition ("distinct edges", subtle)
        float crest = smoothstep(0.05, 0.11, length(N.xz));

        // sun / moon path — layered glints:
        //   tight sparkle + the main golden path + a broad warm sheen
        vec3  H   = normalize(sunDirW - viewDirW);
        float spN = max(dot(N, H), 0.0);
        float glint  = pow(spN, 520.0) * 2.80       // tight sparkle
                     + pow(spN, 48.0)  * 0.55       // golden path
                     + pow(spN, 8.0)   * 0.22;      // broad sheen
        vec3  Hm      = normalize(-sunDirW - viewDirW);
        float glintM  = pow(max(dot(N, Hm), 0.0), 520.0) * 0.45 * w.z;

        color = mix(deepCol, reflection, fresnel)
              + LC * glint
              + LC * crest * 0.06
              + LC * glintM;
        alpha = clamp(mix(0.78, 0.99, fresnel) + crest * 0.06, 0.0, 1.0);

    } else {
        /* ------- other translucents: glass, slime, portals -------
           VANILLA lightmap lighting — no custom lighting. The
           stylized water look applies to WATER ONLY. */
        color = tex.rgb * v_color.rgb * texture2D(lightmap, v_lm).rgb;
        alpha = tex.a * v_color.a;
    }

    // melt into the sunset haze (or thick murk when underwater)
    color = applyDistanceFog(color, viewDirW, sunDirW, w, v_playerPos);

    gl_FragData[0] = vec4(color, alpha);
}
⬇ Save
shaders/gbuffers_water.vsh2.5 KB
#version 120

/*
    ============================================================
    AURORA SUNSET — gbuffers_water.vsh
    ------------------------------------------------------------
    Vertex stage for water (and other translucent geometry).

    * Water is detected through the block ID mapped in
      block.properties (water -> 10001).
    * Top faces are displaced by a smooth directional sine swell.
      The wave is a function of absolute world position, so the
      surface is perfectly seamless across chunk borders.
    * [TAA] INTEGRATION POINT #1: sub-pixel projection jitter for
      DLSS-style upscaling lives in the marked comment below.
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/water.glsl"

attribute vec4 mc_Entity;      // block ID from block.properties

varying vec2  v_tex;
varying vec2  v_lm;
varying vec4  v_color;
varying vec3  v_playerPos;
varying float v_isWater;

void main() {
    v_tex   = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
    v_lm    = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy;
    v_color = gl_Color;

    v_isWater = float(abs(mc_Entity.x - 10001.0) < 0.5);

    vec4 viewPos   = gl_ModelViewMatrix * gl_Vertex;
    vec4 playerPos = gbufferModelViewInverse * viewPos;
    v_playerPos    = playerPos.xyz;

    /* ---- stylized wave displacement (top faces of water only) ---- */
    if (v_isWater > 0.5 && gl_Normal.y > 0.5) {
        vec2  wp   = (playerPos.xyz + cameraPosition).xz;
        float wave = waterWave(wp) * WAVE_HEIGHT;
        viewPos.xyz += mat3Of(gbufferModelView) * vec3(0.0, wave, 0.0);
    }

    /* ============================================================
       [TAA / DLSS-STYLE UPSCALING — INTEGRATION POINT #1]
       Jitter the projection sub-pixel per frame so composite.fsh
       can accumulate the samples temporally:

           float halton(int i, int b) {
               float f = 1.0, r = 0.0;
               while (i > 0) { f /= float(b); r += f * float(i % b); i /= b; }
               return r;
           }
           vec2 j = vec2(halton(frameCounter % 8 + 1, 2),
                         halton(frameCounter % 8 + 1, 3)) - 0.5;
           gl_Position.xy += j * (2.0 / vec2(viewWidth, viewHeight)) * gl_Position.w;

       (scale the jitter by the upscaling factor, e.g. x2 at 50% res)
       ============================================================ */

    gl_Position = gl_ProjectionMatrix * viewPos;
}
⬇ Save
shaders/shaders.properties1.6 KB
##################################################################
#  AURORA SUNSET — shaders.properties
#  Stylized, performance-friendly shader pack for Iris & OptiFine
##################################################################

# ---------------- world ----------------
# Vanilla fancy clouds (they already blush pink/gold at dusk)
clouds=fancy

# No shadow maps in this pack: keeps vanilla face shading + AO
# and skips the whole shadow pass -> big performance win.
oldLighting=true

underwaterOverlay=false
vignette=false
sun=true
moon=true

# ---------------- in-game options ----------------
screen=SUNSET_STRENGTH FOG_DENSITY <empty> WAVE_HEIGHT WAVE_SPEED WAVE_DETAIL WATER_REFLECTIVITY <empty> EXPOSURE BLOOM_STRENGTH SATURATION VIGNETTE_STRENGTH
sliders=SUNSET_STRENGTH FOG_DENSITY WAVE_HEIGHT WAVE_SPEED WAVE_DETAIL WATER_REFLECTIVITY EXPOSURE BLOOM_STRENGTH SATURATION VIGNETTE_STRENGTH

# ---------------- DLSS-STYLE UPSCALING (advanced, OFF) ----------------
# To simulate DLSS: render the gbuffers at reduced resolution, then
# temporally upscale + anti-alias in composite.fsh.
# Recipe:
#   1) uncomment the two lines below
#        size.buffer.colortex0=0.5 0.5
#        size.buffer.colortex1=1.0 1.0
#   2) enable the jitter block  [INTEGRATION POINT #1]  in
#      gbuffers_water.vsh / gbuffers_terrain.vsh
#   3) enable the temporal-resolve block [INTEGRATION POINT #2] in
#      composite.fsh, and change its DRAWBUFFERS to :1 so it writes
#      the full-res result to colortex1 (final.fsh then reads that).
# Disabled by default so the pack works everywhere out of the box.
⬇ Save
shaders/lib/common.glsl1.3 KB
/*
    ============================================================
    AURORA SUNSET — lib/common.glsl
    ------------------------------------------------------------
    Shared uniforms + tiny math helpers. Unused uniforms are
    stripped by the compiler, so including this everywhere is free.
    ============================================================
*/

#ifndef INCLUDE_COMMON
#define INCLUDE_COMMON

#define PI  3.14159265359
#define TAU 6.28318530718

/* ---- uniforms shared by every program ---- */
uniform mat4  gbufferModelView;
uniform mat4  gbufferModelViewInverse;
uniform vec3  cameraPosition;
uniform float frameTimeCounter;
uniform float sunAngle;
uniform float rainStrength;
uniform float viewWidth;
uniform float viewHeight;
uniform float aspectRatio;
uniform float far;
uniform int   isEyeInWater;
uniform int   frameCounter;
uniform vec3  sunPosition;    // view space, length ~100
uniform vec3  moonPosition;   // view space, length ~100

/* mat3 view of a mat4 (GLSL 120-safe matrix-from-matrix) */
#define mat3Of(m) mat3((m)[0].xyz, (m)[1].xyz, (m)[2].xyz)

float luma(vec3 c) { return dot(c, vec3(0.2126, 0.7152, 0.0722)); }

float hash12(vec2 p) {
    vec3 p3 = fract(vec3(p.xyx) * 0.1031);
    p3 += dot(p3, p3.yzx + 33.33);
    return fract((p3.x + p3.y) * p3.z);
}

#endif
⬇ Save
shaders/lib/lighting.glsl2.1 KB
/*
    ============================================================
    AURORA SUNSET — lib/lighting.glsl
    ------------------------------------------------------------
    THIS PACK DOES NOT LIGHT BLOCKS.

    Terrain, plants, leaves, entities, particles and translucent
    blocks (glass etc.) all use the VANILLA lightmap:

        texture  *  gl_Color  *  lightmap

    so every block surface is pixel-identical to Minecraft
    without shaders. Every former custom lighting function was
    REMOVED from the pack on purpose — no directional sun term,
    no rim glow, no ambient recolor, no saturation lift, no
    specular. They must not return.

    The only function here is the violet dusk DISTANCE HAZE:
    it belongs to the sky (the violet-skies look), not to block
    surfaces, and it only fades geometry far from the camera.
    Requires common/settings/sky to be included first.
    ============================================================
*/

#ifndef INCLUDE_LIGHTING
#define INCLUDE_LIGHTING

/*
    Dreamy distance haze that melts geometry into the sky palette.
    - exponential curve: noticeable from ~1/3 of render distance
    - stronger toward the sun (light scattering)
    - capped so nearby geometry is never fully swallowed
*/
vec3 applyDistanceFog(vec3 color, vec3 viewDirW, vec3 sunDir, vec3 w, vec3 playerPos) {
    float dist = length(playerPos);
    float fogF;
    vec3  fogCol;

    if (isEyeInWater == 1) {
        fogF   = 1.0 - exp(-dist * 0.05);
        fogCol = vec3(0.05, 0.13, 0.20);
    } else {
        /* clearer daytime: the haze is tuned for the sunset shot
           (FOG_DENSITY), so scale it way down by day — cinematic
           packs keep daytime air nearly clear */
        float fogDist = dist * FOG_DENSITY * (0.30 * w.x + 1.00 * w.y + 0.45 * w.z);
        fogF = 1.0 - exp(-pow(fogDist / (far * 0.90), 1.6) * 2.2);

        float sunAmt = max(dot(viewDirW, sunDir), 0.0);
        fogF *= mix(0.70, 0.88 + 0.45 * w.y, pow(sunAmt, 2.0));
        fogF  = clamp(fogF, 0.0, 0.96 - 0.38 * w.x);   /* day: never milk out */

        fogCol = skyFogColor(viewDirW, sunDir, w);
    }
    return mix(color, fogCol, fogF);
}

#endif
⬇ Save
shaders/lib/settings.glsl2.2 KB
/*
    ============================================================
    AURORA SUNSET — lib/settings.glsl
    ------------------------------------------------------------
    All user-tweakable values live here. They are exposed in the
    in-game Shader Options screen (Iris & OptiFine) and can also
    be edited by hand.

    Defaults are tuned to the target screenshot: violet-pink sky,
    huge golden sun glow, mirror water with a sparkling light
    path, dreamy distance haze.
    ============================================================
*/

#ifndef INCLUDE_SETTINGS
#define INCLUDE_SETTINGS

/* ---------------- ATMOSPHERE ---------------- */

// 0 = plain day cycle, 1 = reference sunset mood (1.25 = screenshot look)
#define SUNSET_STRENGTH 1.25 // [0.00 0.25 0.50 0.75 1.00 1.25 1.50 2.00]

// How aggressively distant terrain melts into the golden haze
// (set 0.00 for absolutely clear air)
#define FOG_DENSITY 1.50 // [0.00 0.50 0.75 1.00 1.25 1.50 2.00 2.50]

/* ---------------- WATER ---------------- */

// Vertical scale of the vertex swell (in blocks, roughly)
#define WAVE_HEIGHT 0.45 // [0.00 0.20 0.40 0.60 0.80 1.00 1.50]

// Wave animation speed multiplier
#define WAVE_SPEED 0.90 // [0.25 0.50 0.75 0.90 1.00 1.50 2.00]

// Strength of the small ripple normals (fragment-level detail).
// Near-camera wavelets only — distance fades them automatically.
#define WAVE_DETAIL 1.10 // [0.00 0.50 1.00 1.10 1.50 2.00]

// How mirror-like the water surface is (>1.00 = full screenshot mirror)
#define WATER_REFLECTIVITY 1.20 // [0.50 0.75 1.00 1.20 1.50]

/* ---------------- TERRAIN ----------------
   Blocks are 100% VANILLA — the shader never touches block
   lighting or color. Terrain, plants, leaves, entities and
   glass all render with the vanilla lightmap, pixel-identical
   to Minecraft without shaders. There are no sliders here:
   nothing is applied, so there is nothing to tune. */

/* ---------------- POST PROCESSING ---------------- */

#define EXPOSURE 1.10 // [0.80 0.90 1.00 1.10 1.18 1.30]
#define BLOOM_STRENGTH 0.85 // [0.00 0.20 0.40 0.60 0.85 1.10 1.40]
#define SATURATION 1.18 // [0.80 0.90 1.00 1.15 1.30 1.45]
#define VIGNETTE_STRENGTH 0.16 // [0.00 0.10 0.16 0.26 0.40]

#endif
⬇ Save
shaders/lib/sky.glsl7.3 KB
/*
    ============================================================
    AURORA SUNSET — lib/sky.glsl
    ------------------------------------------------------------
    Stylized sky + light colors, tuned to match the target
    screenshot ("pastel dream dusk"):

      * luminous violet zenith
      * lavender-pink mid sky
      * cream-pink horizon, cream-gold glow around the sun
      * three-lobe sun glow (wide flood + halo + hot core)
      * dusk lingers longer than vanilla (wider time window)

    DIMENSION ROUTING — Iris and OptiFine define exactly one
    WORLD_* macro per dimension (WORLD_NETHER, WORLD_END; the
    overworld gets neither). The Nether / End branches below
    carry the same blood-red / blue-black palettes as
    shaders/world-1/lib/sky.glsl and shaders/world1/lib/sky.glsl,
    so every loader resolves the right sky no matter which
    folder its include resolution prefers. The test suite
    asserts the two copies never drift apart.

    Requires lib/common.glsl + lib/settings.glsl to be included
    first.
    ============================================================
*/

#ifndef INCLUDE_SKY
#define INCLUDE_SKY

/* w = (dayWeight, duskWeight, nightWeight), sums to 1.
   The dusk window is deliberately wide: the violet/gold mood
   starts before sunset and lingers after. */
vec3 skyTimeWeights(float sunH) {
#ifdef WORLD_NETHER
    /* The Nether has no day cycle: fixed weight set (day, dusk, night) */
    return vec3(0.0, 0.60, 0.40);
#else
#ifdef WORLD_END
    /* The End has no day cycle: night-leaning weights */
    return vec3(0.0, 0.15, 0.85);
#else
    float dayF   = smoothstep(0.05, 0.42,  sunH);
    float nightF = smoothstep(0.05, 0.42, -sunH);
    float duskF  = clamp(1.0 - dayF - nightF, 0.0, 1.0) * SUNSET_STRENGTH;
    float total  = max(dayF + duskF + nightF, 1e-4);
    return vec3(dayF, duskF, nightF) / total;
#endif
#endif
}

/* Direct light color: soft white by day, peach at dusk, dim moon blue */
vec3 sunLightColor(vec3 w) {
#ifdef WORLD_NETHER
    /* dim ember — the Nether has no sun; keeps compiled-but-unexecuted paths consistent */
    return vec3(0.85, 0.32, 0.16) * 0.35;
#else
#ifdef WORLD_END
    /* faint cool light — the End has no sun */
    return vec3(0.45, 0.55, 0.85) * 0.20;
#else
    return vec3(1.00, 0.96, 0.88) * w.x
         + vec3(1.00, 0.80, 0.55) * w.y
         + vec3(0.38, 0.46, 0.68) * w.z * 0.38;
#endif
#endif
}

/*
    The stylized sky. dir & sunDir are unit vectors in world space.

    Overworld layers (dusk):
      1. 4-stop vertical gradient  violet -> lavender -> cream-pink
      2. sun-azimuth warm band     cream turns golden toward the sun
      3. three-lobe sun glow       wide flood + mid halo + hot core
      4. moon halo / rain wash / void sink
*/
vec3 skyGradient(vec3 dir, vec3 sunDir, vec3 w) {
#ifdef WORLD_NETHER
    /* NETHER: blackened ember charcoal top, dark crimson mid,
       blood-red horizon with a soft ember glow all around —
       no sun direction, the horizon burns evenly. */
    float h      = dir.y;
    float hUp    = clamp(h, 0.0, 1.0);
    float belowF = smoothstep(0.00, 0.35, -h);

    vec3 zenith  = vec3(0.050, 0.014, 0.014);   /* blackened ember */
    vec3 mid     = vec3(0.170, 0.034, 0.030);   /* dark crimson    */
    vec3 horizon = vec3(0.470, 0.090, 0.052);   /* blood red       */

    float midF = smoothstep(0.52, 0.08, hUp);
    float horF = smoothstep(0.30, 0.02, hUp);

    vec3 col = mix(zenith, mid, midF);
    col      = mix(col, horizon, horF * 0.90);

    /* soft ember glow all around the horizon */
    col += vec3(0.55, 0.14, 0.06) * horF * 0.35;

    /* sink into the dark below the horizon */
    col *= 1.0 - 0.45 * belowF;

    return col;
#else
#ifdef WORLD_END
    /* END: blue-black void. Near-black top, restrained
       desaturated blue toward the horizon. No stars. */
    float h      = dir.y;
    float hUp    = clamp(h, 0.0, 1.0);
    float belowF = smoothstep(0.00, 0.35, -h);

    vec3 zenith  = vec3(0.012, 0.014, 0.034);   /* blue-black          */
    vec3 mid     = vec3(0.024, 0.030, 0.060);   /* deep navy           */
    vec3 horizon = vec3(0.060, 0.078, 0.135);   /* dark desaturated blue */

    float midF = smoothstep(0.52, 0.08, hUp);
    float horF = smoothstep(0.30, 0.02, hUp);

    vec3 col = mix(zenith, mid, midF);
    col      = mix(col, horizon, horF * 0.90);

    /* whisper of blue lift along the horizon */
    col += vec3(0.10, 0.14, 0.24) * horF * 0.30;

    /* sink into the void below */
    col *= 1.0 - 0.50 * belowF;

    return col;
#else
    float h   = dir.y;
    float hUp = clamp(h, 0.0, 1.0);
    float belowF = smoothstep(0.00, 0.35, -h);

    /* ---- 1. vertical gradients ---- */
    vec3 dayCol = mix(vec3(0.66, 0.80, 0.93), vec3(0.18, 0.42, 0.78), smoothstep(0.0, 0.55, hUp));

    vec3 duskZenith = vec3(0.260, 0.220, 0.660);   /* luminous violet-blue */
    vec3 duskMid    = vec3(0.740, 0.520, 0.800);   /* lavender-pink        */
    vec3 duskHor    = vec3(1.000, 0.800, 0.720);   /* cream-pink           */
    float midF  = smoothstep(0.52, 0.08, hUp);     /* rises to horizon */
    float horF  = smoothstep(0.30, 0.02, hUp);
    vec3  duskCol = mix(duskZenith, duskMid, midF);
    duskCol       = mix(duskCol, duskHor, horF * 0.90);

    vec3 nightCol = mix(vec3(0.055, 0.065, 0.125), vec3(0.012, 0.016, 0.048), hUp);

    vec3 col = dayCol * w.x + duskCol * w.y + nightCol * w.z;

    /* ---- 2. sun-azimuth warm band (strongest low, toward the sun) ---- */
    vec2  dirXZ = normalize(dir.xz + vec2(1e-5, 0.0));
    vec2  sunXZ = normalize(sunDir.xz + vec2(1e-5, 0.0));
    float azim  = max(dot(dirXZ, sunXZ), 0.0);
    float band  = pow(azim, 2.5) * horF;
    col = mix(col, vec3(1.08, 0.90, 0.64), band * 0.85 * w.y);

    /* ---- 3. the BIG sunset glow (cream, not ember) ---- */
    float cosSun = max(dot(dir, sunDir), 0.0);
    float gWide  = pow(cosSun, 2.0);                 /* floods half the sky */
    float gMid   = pow(cosSun, 6.0);                 /* halo                */
    float gCore  = pow(cosSun, 40.0);                /* hot center          */
    col += (vec3(1.06, 0.84, 0.60) * gWide * 0.62
          + vec3(1.16, 0.98, 0.70) * gMid  * 0.88
          + vec3(1.28, 1.16, 0.88) * gCore * 1.30) * w.y;

    /* by day, a milder warm breath around the sun near the horizon */
    col += vec3(1.00, 0.85, 0.60) * gMid * horF * 0.16 * w.x;

    /* ---- 4. moon halo ---- */
    col += vec3(0.48, 0.55, 0.80)
         * pow(max(dot(dir, -sunDir), 0.0), 42.0) * w.z * 0.55;

    /* sink into the void below the horizon */
    col *= 1.0 - 0.55 * belowF;

    /* rain washes the mood out */
    col = mix(col, vec3(luma(col)) * vec3(0.75, 0.80, 0.88), rainStrength * 0.75);

    return col;
#endif
#endif
}

/*
    Fog / haze color along a view direction. skyGradient already
    turns cream-gold toward the sun, so distance haze automatically
    reads golden on the sun side and violet on the shadow side.
    Dimension branches mirror their world-folder lib files exactly.
*/
vec3 skyFogColor(vec3 viewDirW, vec3 sunDir, vec3 w) {
#ifdef WORLD_NETHER
    /* Crimson distance haze: terrain melts into the red. */
    return skyGradient(viewDirW, sunDir, w) * 1.05;
#else
#ifdef WORLD_END
    /* Dark-blue distance haze: far end-stone melts into the void. */
    return skyGradient(viewDirW, sunDir, w) * 1.05;
#else
    return skyGradient(viewDirW, sunDir, w) * 1.06;
#endif
#endif
}

#endif
⬇ Save
shaders/lib/water.glsl2.8 KB
/*
    ============================================================
    AURORA SUNSET — lib/water.glsl
    ------------------------------------------------------------
    Stylized wave field tuned to the target screenshot:

      * big calm swell (10+ block wavelengths) for the mirror body
      * TWO gentle near-camera wavelet octaves (~2.7 / ~3.4 block
        wavelengths) that give the sparkly ripples seen up close —
        gbuffers_water fades them out with distance (nFade) so the
        far surface stays a clean, shimmer-free mirror
      * nothing repeats per-block -> no tiled/woven pattern
      * total tilt stays small (< ~9 degrees) -> glassy, calm

    waterWave()       : vertex displacement (big swell only)
    waterHeight()     : full height (reference / debugging)
    waterWaveNormal() : analytic normal for shading

    All waves are pure functions of absolute world position, so
    the surface is seamless across chunk borders.
    ============================================================
*/

#ifndef INCLUDE_WATER
#define INCLUDE_WATER

#define WAVE_TIME (frameTimeCounter * WAVE_SPEED)

/* --- vertex swell (smooth, big, calm) --------------------------------*/
float waterWave(vec2 p) {
    float t = WAVE_TIME;
    float h  = sin(dot(p, vec2( 0.50, 0.30)) + t * 0.9) * 0.045;   /* ~11 block swell */
    h += sin(dot(p, vec2(-0.36, 0.42)) + t * 1.3) * 0.028;         /* ~11 block cross */
    return h;
}

/* --- full surface height (vertex swell + shading-only detail) --------*/
float waterHeight(vec2 p) {
    float t = WAVE_TIME;
    float h = waterWave(p);
    h += sin(dot(p, vec2( 0.90, -0.65)) + t * 1.6) * 0.012;        /* ~6 block detail  */
    h += sin(dot(p, vec2(-1.30,  0.75)) + t * 2.1) * 0.007;        /* ~4 block detail  */
    h += sin(dot(p, vec2( 1.70, -1.10)) + t * 2.6) * 0.004;        /* ~3.4 block ripple */
    h += sin(dot(p, vec2(-2.00,  1.20)) + t * 3.1) * 0.003;        /* ~2.7 block ripple */
    return h;
}

/* --- analytic gradient of the height field (for normals) ------------*/
vec2 waterGradient(vec2 p) {
    float t = WAVE_TIME;
    vec2 g = vec2(0.0);
    vec2 d; float a;

    d = vec2( 0.50,  0.30); a = 0.075; g += d * cos(dot(p, d) + t * 0.9) * a;
    d = vec2(-0.36,  0.42); a = 0.050; g += d * cos(dot(p, d) + t * 1.3) * a;
    d = vec2( 0.90, -0.65); a = 0.020; g += d * cos(dot(p, d) + t * 1.6) * a;
    d = vec2(-1.30,  0.75); a = 0.012; g += d * cos(dot(p, d) + t * 2.1) * a;
    /* near-camera wavelets — faded out by nFade in gbuffers_water.fsh */
    d = vec2( 1.70, -1.10); a = 0.012; g += d * cos(dot(p, d) + t * 2.6) * a;
    d = vec2(-2.00,  1.20); a = 0.009; g += d * cos(dot(p, d) + t * 3.1) * a;
    return g;
}

vec3 waterWaveNormal(vec2 p) {
    vec2 g = waterGradient(p) * WAVE_DETAIL;
    return normalize(vec3(-g.x, 1.0, -g.y));
}

#endif
⬇ Save
shaders/world-1/composite.fsh1.9 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    ============================================================
    AURORA SUNSET — NETHER post-process (world-1/composite.fsh)
    ------------------------------------------------------------
    Neutral post chain for the Nether: bloom + filmic tone map
    + gentle vibrance + vignette. The overworld violet/gold
    sunset grade is deliberately NOT applied here — nothing in
    this dimension should smell like overworld dusk, and blocks
    stay vanilla.
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"

uniform sampler2D colortex0;   // the scene (= gcolor)

varying vec2 v_tex;

vec3 aces(vec3 x) {
    return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
}

void main() {
    vec3 color = texture2D(colortex0, v_tex).rgb;

    if (isEyeInWater == 1) color *= vec3(0.60, 0.45, 0.40);   /* ember murk */

    /* ---------------- bloom (same block-safe threshold) ---------------- */
    const int   TAPS   = 20;
    const float RADIUS = 0.016;
    vec3 bloom = vec3(0.0);
    for (int i = 0; i < TAPS; i++) {
        float fi  = float(i);
        float ang = fi * 2.39996323;                      // golden angle
        float r   = sqrt((fi + 0.5) / float(TAPS)) * RADIUS;
        vec2 off  = clamp(v_tex + vec2(cos(ang), sin(ang) * aspectRatio) * r,
                          vec2(0.001), vec2(0.999));
        bloom += max(texture2D(colortex0, off).rgb - vec3(1.02), vec3(0.0));
    }
    bloom /= float(TAPS);
    color += bloom * BLOOM_STRENGTH * 1.9;

    /* ---------------- tone map + gentle vibrance ---------------- */
    color = aces(color * EXPOSURE);
    color = mix(vec3(luma(color)), color, 1.10);

    /* ---------------- vignette ---------------- */
    vec2 q = v_tex - 0.5;
    color *= 1.0 - dot(q, q) * VIGNETTE_STRENGTH * 2.0;

    gl_FragData[0] = vec4(color, 1.0);
}
⬇ Save
shaders/world-1/composite.vsh212 B
#version 120

/*  AURORA SUNSET — composite.vsh (fullscreen pass-through quad) */

varying vec2 v_tex;

void main() {
    gl_Position = ftransform();
    v_tex = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
}
⬇ Save
shaders/world-1/gbuffers_skybasic.fsh618 B
#version 120
/* DRAWBUFFERS:0 */

/*
    AURORA SUNSET — NETHER sky (shaders/world-1/gbuffers_skybasic.fsh)
    Blood-red gradient dome for the Nether. No stars (the Nether
    has none), no sun glow. The palette comes from this
    dimension's lib/sky.glsl override.
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"

varying vec3 v_dir;

void main() {
    vec3 dir     = normalize(v_dir);
    vec3 sunDirW = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 w       = skyTimeWeights(sunDirW.y);

    gl_FragData[0] = vec4(skyGradient(dir, sunDirW, w), 1.0);
}
⬇ Save
shaders/world-1/gbuffers_skybasic.vsh334 B
#version 120

/*
    AURORA SUNSET — gbuffers_skybasic.vsh
    Vanilla sky dome / void plane / stars.
*/

#include "/lib/common.glsl"

varying vec3 v_dir;    // world-space direction from the camera

void main() {
    gl_Position = ftransform();
    v_dir = mat3Of(gbufferModelViewInverse) * (gl_ModelViewMatrix * gl_Vertex).xyz;
}
⬇ Save
shaders/world-1/lib/sky.glsl2.5 KB
/*
    ============================================================
    AURORA SUNSET — NETHER SKY (shaders/world-1/lib/sky.glsl)
    ------------------------------------------------------------
    Dimension-specific palette for the NETHER: blood-red sky,
    crimson ember haze.

    This file OVERRIDES the overworld lib/sky.glsl for this
    dimension only (per-file dimension fallback), so every
    program that asks for sky/fog colors automatically gets
    the Nether palette — including the fallback terrain /
    entity / particle programs, whose distance haze now melts
    into crimson instead of violet.

    Blocks, water, sun and moon are NOT touched: this file
    only provides sky/fog/light COLORS with the exact same
    function signatures as the overworld version.

    Requires lib/common.glsl + lib/settings.glsl to be
    included first (same contract as the overworld sky.glsl).
    ============================================================
*/

#ifndef INCLUDE_SKY
#define INCLUDE_SKY

/* The Nether has no day cycle: return a fixed weight set.
   (day, dusk, night) — dusk-leaning so the shared fog code
   sits between "cinematic haze" and "dark cave". */
vec3 skyTimeWeights(float sunH) {
    return vec3(0.0, 0.60, 0.40);
}

/* Dim ember "sun" — the Nether has no sun; this only keeps
   the compiled-but-unexecuted water/light paths consistent. */
vec3 sunLightColor(vec3 w) {
    return vec3(0.85, 0.32, 0.16) * 0.35;
}

/*
    The Nether sky: blackened ember charcoal at the top,
    dark crimson mid, blood-red horizon with a soft ember
    glow all around (the classic nether haze — no sun
    direction, the horizon burns evenly).
*/
vec3 skyGradient(vec3 dir, vec3 sunDir, vec3 w) {
    float h      = dir.y;
    float hUp    = clamp(h, 0.0, 1.0);
    float belowF = smoothstep(0.00, 0.35, -h);

    vec3 zenith  = vec3(0.050, 0.014, 0.014);   /* blackened ember */
    vec3 mid     = vec3(0.170, 0.034, 0.030);   /* dark crimson    */
    vec3 horizon = vec3(0.470, 0.090, 0.052);   /* blood red       */

    float midF = smoothstep(0.52, 0.08, hUp);
    float horF = smoothstep(0.30, 0.02, hUp);

    vec3 col = mix(zenith, mid, midF);
    col      = mix(col, horizon, horF * 0.90);

    /* soft ember glow all around the horizon */
    col += vec3(0.55, 0.14, 0.06) * horF * 0.35;

    /* sink into the dark below the horizon */
    col *= 1.0 - 0.45 * belowF;

    return col;
}

/* Crimson distance haze: terrain melts into the red. */
vec3 skyFogColor(vec3 viewDirW, vec3 sunDir, vec3 w) {
    return skyGradient(viewDirW, sunDir, w) * 1.05;
}

#endif
⬇ Save
shaders/world1/composite.fsh1.9 KB
#version 120
/* DRAWBUFFERS:0 */

/*
    ============================================================
    AURORA SUNSET — END post-process (world1/composite.fsh)
    ------------------------------------------------------------
    Neutral post chain for the End: bloom + filmic tone map +
    gentle vibrance + vignette. The overworld violet/gold
    sunset grade is deliberately NOT applied here — the End
    stays cold, dark and blue-black. Blocks stay vanilla.
    ============================================================
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"

uniform sampler2D colortex0;   // the scene (= gcolor)

varying vec2 v_tex;

vec3 aces(vec3 x) {
    return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
}

void main() {
    vec3 color = texture2D(colortex0, v_tex).rgb;

    if (isEyeInWater == 1) color *= vec3(0.50, 0.55, 0.70);   /* cold murk */

    /* ---------------- bloom (same block-safe threshold) ---------------- */
    const int   TAPS   = 20;
    const float RADIUS = 0.016;
    vec3 bloom = vec3(0.0);
    for (int i = 0; i < TAPS; i++) {
        float fi  = float(i);
        float ang = fi * 2.39996323;                      // golden angle
        float r   = sqrt((fi + 0.5) / float(TAPS)) * RADIUS;
        vec2 off  = clamp(v_tex + vec2(cos(ang), sin(ang) * aspectRatio) * r,
                          vec2(0.001), vec2(0.999));
        bloom += max(texture2D(colortex0, off).rgb - vec3(1.02), vec3(0.0));
    }
    bloom /= float(TAPS);
    color += bloom * BLOOM_STRENGTH * 1.9;

    /* ---------------- tone map + gentle vibrance ---------------- */
    color = aces(color * EXPOSURE);
    color = mix(vec3(luma(color)), color, 1.10);

    /* ---------------- vignette ---------------- */
    vec2 q = v_tex - 0.5;
    color *= 1.0 - dot(q, q) * VIGNETTE_STRENGTH * 2.0;

    gl_FragData[0] = vec4(color, 1.0);
}
⬇ Save
shaders/world1/composite.vsh212 B
#version 120

/*  AURORA SUNSET — composite.vsh (fullscreen pass-through quad) */

varying vec2 v_tex;

void main() {
    gl_Position = ftransform();
    v_tex = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
}
⬇ Save
shaders/world1/gbuffers_skybasic.fsh595 B
#version 120
/* DRAWBUFFERS:0 */

/*
    AURORA SUNSET — END sky (shaders/world1/gbuffers_skybasic.fsh)
    Deep blue-black void gradient for the End. No stars, no sun
    glow. The palette comes from this dimension's lib/sky.glsl
    override.
*/

#include "/lib/common.glsl"
#include "/lib/settings.glsl"
#include "/lib/sky.glsl"

varying vec3 v_dir;

void main() {
    vec3 dir     = normalize(v_dir);
    vec3 sunDirW = normalize(mat3Of(gbufferModelViewInverse) * sunPosition);
    vec3 w       = skyTimeWeights(sunDirW.y);

    gl_FragData[0] = vec4(skyGradient(dir, sunDirW, w), 1.0);
}
⬇ Save
shaders/world1/gbuffers_skybasic.vsh334 B
#version 120

/*
    AURORA SUNSET — gbuffers_skybasic.vsh
    Vanilla sky dome / void plane / stars.
*/

#include "/lib/common.glsl"

varying vec3 v_dir;    // world-space direction from the camera

void main() {
    gl_Position = ftransform();
    v_dir = mat3Of(gbufferModelViewInverse) * (gl_ModelViewMatrix * gl_Vertex).xyz;
}
⬇ Save
shaders/world1/lib/sky.glsl2.5 KB
/*
    ============================================================
    AURORA SUNSET — END SKY (shaders/world1/lib/sky.glsl)
    ------------------------------------------------------------
    Dimension-specific palette for the END: deep blue-black
    void gradient, cold dark-blue haze.

    This file OVERRIDES the overworld lib/sky.glsl for this
    dimension only (per-file dimension fallback), so every
    program that asks for sky/fog colors automatically gets
    the End palette — including the fallback terrain /
    entity / particle programs, whose distance haze now melts
    into dark blue instead of violet.

    Blocks, water, sun and moon are NOT touched: this file
    only provides sky/fog/light COLORS with the exact same
    function signatures as the overworld version.

    Requires lib/common.glsl + lib/settings.glsl to be
    included first (same contract as the overworld sky.glsl).
    ============================================================
*/

#ifndef INCLUDE_SKY
#define INCLUDE_SKY

/* The End has no day cycle: return a fixed weight set.
   (day, dusk, night) — night-leaning so the shared fog code
   keeps the air thin, cold and dark. */
vec3 skyTimeWeights(float sunH) {
    return vec3(0.0, 0.15, 0.85);
}

/* Faint cool light — the End has no sun; this only keeps the
   compiled-but-unexecuted water/light paths consistent. */
vec3 sunLightColor(vec3 w) {
    return vec3(0.45, 0.55, 0.85) * 0.20;
}

/*
    The End sky: blue-black void. Near-black at the top,
    a restrained desaturated blue toward the horizon —
    dark, cold, silent. No stars (vanilla End has none).
*/
vec3 skyGradient(vec3 dir, vec3 sunDir, vec3 w) {
    float h      = dir.y;
    float hUp    = clamp(h, 0.0, 1.0);
    float belowF = smoothstep(0.00, 0.35, -h);

    vec3 zenith  = vec3(0.012, 0.014, 0.034);   /* blue-black          */
    vec3 mid     = vec3(0.024, 0.030, 0.060);   /* deep navy           */
    vec3 horizon = vec3(0.060, 0.078, 0.135);   /* dark desaturated blue */

    float midF = smoothstep(0.52, 0.08, hUp);
    float horF = smoothstep(0.30, 0.02, hUp);

    vec3 col = mix(zenith, mid, midF);
    col      = mix(col, horizon, horF * 0.90);

    /* whisper of blue lift along the horizon */
    col += vec3(0.10, 0.14, 0.24) * horF * 0.30;

    /* sink into the void below */
    col *= 1.0 - 0.50 * belowF;

    return col;
}

/* Dark-blue distance haze: far end-stone melts into the void. */
vec3 skyFogColor(vec3 viewDirW, vec3 sunDir, vec3 w) {
    return skyGradient(viewDirW, sunDir, w) * 1.05;
}

#endif
⬇ Save
📁 Resource pack files 22 files embedded · click a file name to read it

pack.mcmeta, textures and README from the resource pack — text files open inline, textures preview as images.

README.md2.8 KB
# Aurora Sunset — Resources

Companion **resource pack** to the *Aurora Sunset* shader pack (works great
standalone too). It restyles the core environment assets to match the
golden-hour / violet-water aesthetic:

| Texture | What changed |
| --- | --- |
| `environment/sun.png` | **v3:** big soft radial golden glow — hot white-gold core melting into a wide amber halo (screenshot sun) |
| `environment/moon_phases.png` | **v3:** all 8 phases as violet-silver moons with soft rim glow and correct crescent/gibbous masks |
| `block/water_still.png` | v2: **calm, low-contrast** animated surface — gentle luminance band (190–222) instead of harsh ripples (32 frames, seamless loop) |
| `block/water_flow.png` | v2: soft diagonal flow bands, matched low contrast (32 frames, seamless loop) |
| `block/water_overlay.png` | Softer, cleaner teal screen layer when head is in water |
| `misc/underwater.png` | Lighter stylized underwater tint |
| `pack.png` | AI-generated sunset icon |

## Design notes

- **Water stays grayscale** so vanilla biome tints still work
  (swamp murk, warm ocean green, etc. — everything recolors correctly).
- **Animations are mathematically seamless**: integer sine frequencies per
  tile + integer phase multipliers over the 32-frame cycle -> no popping,
  no visible seam between blocks.
- **v2 contrast fix**: v1 used a 60–230 luminance swing which tiled into
  a busy "woven" pattern. v2 stays within 190–222 — the water reads as
  calm, softly moving glass, exactly like the reference art.
- Water alpha is ~0.78, giving a pleasant see-through surface even without
  shaders. With the *Aurora Sunset* shader pack enabled, the shader's own
  Fresnel/transparency drives the final look — the two pack together.
- **v3 sun**: vanilla draws the sun additively, so brightness IS the glow —
  the texture encodes a hot core + wide amber falloff that reads as the
  big soft sunset sun from the target screenshot (shader pack adds the
  huge skyGradient halo + bloom on top).
- **v3 moon**: violet-silver discs, shadow-circle phase masking (full,
  gibbous, quarter, crescent, new), faint rim glow so it sits naturally
  in the violet night sky.

## Compatibility

- Minecraft 1.20.5+ natively (`pack_format` 34); `supported_formats` covers
  1.20+ releases. Older versions will show a compatibility warning but can
  still be force-enabled.
- No opt-in/ experimental features required. Safe to combine with the
  Aurora Sunset shader pack (shaders override shading, resource pack
  overrides the textures — they complement, not conflict).

## Install

1. Drop `AuroraSunset-Resources.zip` into `.minecraft/resourcepacks/`
2. Options -> Resource Packs -> enable **Aurora Sunset Resources**
3. Pair with `AuroraSunset.zip` in `shaderpacks/` for the full look.

## License

CC0 — do whatever you want.
⬇ Save
pack.mcmeta196 B
{
  "pack": {
    "pack_format": 34,
    "supported_formats": { "min_inclusive": 15, "max_inclusive": 999 },
    "description": "§6Aurora Sunset §8| §7Golden-hour skies & stylized water"
  }
}
⬇ Save
pack.png26.2 KB
Texture preview of pack.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/dirt.png593 B
Texture preview of assets/minecraft/textures/block/dirt.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/grass_block_side.png605 B
Texture preview of assets/minecraft/textures/block/grass_block_side.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/grass_block_side_overlay.png207 B
Texture preview of assets/minecraft/textures/block/grass_block_side_overlay.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/grass_block_top.png639 B
Texture preview of assets/minecraft/textures/block/grass_block_top.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/oak_leaves.png663 B
Texture preview of assets/minecraft/textures/block/oak_leaves.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/oak_log.png491 B
Texture preview of assets/minecraft/textures/block/oak_log.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/oak_log_top.png479 B
Texture preview of assets/minecraft/textures/block/oak_log_top.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/red_sand.png604 B
Texture preview of assets/minecraft/textures/block/red_sand.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/sand.png614 B
Texture preview of assets/minecraft/textures/block/sand.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/snow.png397 B
Texture preview of assets/minecraft/textures/block/snow.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/stone.png398 B
Texture preview of assets/minecraft/textures/block/stone.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/water_flow.png11.9 KB
Texture preview of assets/minecraft/textures/block/water_flow.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/water_flow.png.mcmeta36 B
{ "animation": { "frametime": 1 } }
⬇ Save
assets/minecraft/textures/block/water_overlay.png311 B
Texture preview of assets/minecraft/textures/block/water_overlay.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/water_still.png3.6 KB
Texture preview of assets/minecraft/textures/block/water_still.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/block/water_still.png.mcmeta36 B
{ "animation": { "frametime": 2 } }
⬇ Save
assets/minecraft/textures/environment/moon_phases.png3.8 KB
Texture preview of assets/minecraft/textures/environment/moon_phases.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/environment/sun.png1.1 KB
Texture preview of assets/minecraft/textures/environment/sun.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save
assets/minecraft/textures/misc/underwater.png267 B
Texture preview of assets/minecraft/textures/misc/underwater.png

Texture preview — the real file saves with the ⬇ button.

⬇ Save

Using this file (beginner guide)

  1. Save this page once: press Ctrl+S (Windows) or Cmd+S (Mac) → keep index.html anywhere you like.
  2. Open it anytime by double-clicking the saved file — no internet required, it works on any laptop.
  3. Click any ⬇ button → the file is saved to your Downloads folder. If a click does nothing, right-click the button → Save link as… (this always works).

Install in Minecraft (Java)

  1. Shader pack: put AuroraSunset-Shaderpack.zip into .minecraft/shaderpacks/ (don’t unzip)
  2. Resource pack: put AuroraSunset-Resources.zip into .minecraft/resourcepacks/ (don’t unzip)
  3. Enable both: Video Settings → Shader Packs → select AuroraSunset (it must be highlighted!) · Resource Packs → enable Aurora Sunset Resources
  4. Sunset time: run /time set 12200 and look toward the sun 🌅