All Mods Resource Packs Data Packs Shaders Modpacks Plugins
Vitrail Shaders

Vitrail Shaders

by avpbynf • Downloads: 0 • Followers: 0
Description
Gallery
Changelog
Versions

OptiFine-format shader packs, on Minecraft's native Vulkan renderer

Minecraft now ships a native Vulkan renderer alongside the OpenGL one. Every shader pack that exists was written for OpenGL, and none of them run on it.

Vitrail runs them anyway, unmodified. It reads an OptiFine-format pack out of shaderpacks/, translates its GLSL once when the pack loads, and hands it to the compiler the game already embeds. Nothing translates while a frame is drawn.

It started as a question, whether packs written for OpenGL over more than a decade could run untouched on the renderer that now ships with the game, and as one person's side project, worked on every day since July. Contributors have joined along the way, and it is still an early one: the backend it runs on is marked experimental by the game itself.

It is built the way a lot of software gets built now, and it would not exist otherwise: AI tools do most of the typing and the debugging, and a human decides what gets built, tests it against real packs and against Iris, and carries the blame for every bug. What was taken from Iris and from Kroppeb's stareval is credited file by file in the project's NOTICE, under the same licence. If any of that matters to you, now you know. If the mod is useful, there is a coffee link below, and the issues are where I answer.

Before you install: it is a beta

  • The Vulkan backend is experimental, marked so by the game itself: the setting you have to turn on reads "Prefer Vulkan (Experimental)".
  • The world goes through your pack: terrain, water, shadows, sky, clouds, weather, particles, mobs, block entities, the held hand, name plates and signs. What still comes from the game, the engine names in its log when a place first draws, and that list shrinks release by release.
  • Some packs still come out wrong in places, and a wrong picture is worse than a missing one. The table of packs actually tried starts from what you see and names the cause.
  • If what you want today is a finished picture, use Iris on the OpenGL backend instead. It does that job well, and it is the reference this engine is checked against, frame against frame.

Bring your own pack

Vitrail is the engine, not the pack, and it can ship none: the packs belong to their authors and their licences do not allow redistribution. These are the best known of the packs it draws.

Every other pack in the table of packs actually tried draws as well, and the table says how close each one comes to Iris. A pack absent from it is one I have not loaded, not one that is unsupported.

After you install

  • Switch the game to Vulkan and restart it. Video Settings, "Prefer Vulkan (Experimental)". The backend is picked when the game boots, so it takes effect on the next launch.
  • Pick your pack with I. It opens the shader pack screen, R reads the pack again from disk and K turns shaders off and back on. All three can be rebound in the game's controls, under Vitrail.
  • If the frame rate comes up short, there is a slider for it. Video Settings, on Vitrail's own page, "Render Scale": the world is drawn at 25 to 100 percent of the window and brought back to full size before the interface, so menus, chat and the F3 screen stay sharp whatever the scale.
  • Distant Horizons is compatible, and your pack's own DH programs draw its far terrain. On Fabric, install it like any other mod. On NeoForge its current release still crashes on the Vulkan renderer (its own texture unwrapper, not this mod), so install this build by hand instead.
  • Chloride is not needed, and if you run it, five of its settings decide what reaches your pack: Fast Chests and Fast Beds on the Performance page, Max Entity Distance, Max Monster Distance and Max Block Entity Distance on the Entities page. Vitrail names in the log at startup any it finds on.

Client only, one jar for Fabric and NeoForge. Iris can stay installed beside it, on the Sodium version Iris asks for, which Vitrail runs on too: on Vulkan Vitrail draws, on OpenGL Iris does, and switching the backend in the video settings switches engines. The install guide has the rest.

Links and credits

If a pack or a mod does not work with Vitrail, please open an issue. A pack that draws wrong, a mod that clashes, a crash: every report helps, and if you want to take part, pull requests are very welcome.

Source, what goes through a pack today, the changelog and the full compatibility notes are all at Vitrail-Shaders. It is also on CurseForge.

LGPL-3.0-only. Parts of the pack loader and of the value catalogue are adapted from Iris, which is LGPL-3.0 as well, and the expression grammar is Kroppeb's stareval. What was taken and what was changed on the way is recorded file by file in the project's NOTICE.

How to Install Vitrail Shaders (Mod)

Vitrail Shaders by avpbynf is verified for Fabric, Neoforge across Minecraft versions 26.2, 26.3 (latest release: 0.13.0-beta+mc26.3, file size: 1.8 MB). Follow the steps below to install it safely from ModCraft.tv:

  1. Click the Download button above and select your Minecraft version (26.2, 26.3) and platform (Fabric, Neoforge).
  2. Make sure you have the compatible loader or environment installed for Fabric, Neoforge.
  3. Move the downloaded Vitrail Shaders file into your Minecraft .minecraft/mods folder and launch the game.

All Versions

+ Add Version
Name Game version Platforms Published Downloads Actions
26.3
Fabric Neoforge
17d ago 1
26.2
Fabric Neoforge
17d ago 1
26.3
Fabric Neoforge
1mo ago 1
26.2
Fabric Neoforge
1mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric Neoforge
2mo ago 1
26.2
Fabric
2mo ago 1
26.2
Neoforge
2mo ago 1
26.2
Fabric
2mo ago 1
26.2
Neoforge
2mo ago 1
26.2
Fabric
2mo ago 1
26.2
Neoforge
2mo ago 1
26.2
Fabric
3mo ago 1
26.2
Neoforge
3mo ago 1
### Added

  • K turns shaders off and back on**, as it does under Iris. Turning them back on returns to
the pack you had picked, and a line in chat says which way it went. If the pack cannot be drawn,
because it fails to load, is no longer in the folder or none was picked, shaders stay off and
the line says why, so the next press tries again. The key can be moved in the game's controls,
under Vitrail, beside the two that open the settings and reload the pack.

### Fixed

  • Distant Horizons' own clouds stay out of a pack that asks for that.** With Distant Horizons
installed, its blocky clouds were drawn over the pack's sky even when the pack writes
dhClouds=off, as Complementary does. They were hardest to miss under blindness, where the
pack's own clouds go dark and Distant Horizons' stayed bright. They are now held off for as long
as such a pack is loaded, as Iris does, and your own Distant Horizons setting is left as it was.
  • Distant Horizons' menu says who holds a setting it will not let you move.** Where a pack
draws the far terrain, Vitrail holds off Distant Horizons' own fog and ambient occlusion, and
its clouds wherever a pack asks. The menu showed those lines locked and "controlled by
UNKNOWN", and Distant Horizons wrote a warning in the log for each. They are now held under
Vitrail's name, on a Distant Horizons recent enough to take one.
  • Mining a block shows its cracks again on 26.3.** With a shader pack loaded, the crack overlay
never appeared and the block simply broke. 26.3 draws the crack over an ordinary block earlier in
the frame than 26.2 did, among the solid features, and Vitrail was only waiting for it among the
translucent ones. It is now drawn with the pack's gbuffers_damagedblock at either moment, so the
crack over stone and the crack over glass both show.
  • Banners show their colours and patterns again on 26.3.** With a shader pack loaded, every
banner was plain white cloth. 26.3 draws a banner's colour layers among the solid features where
26.2 drew them with the translucent ones, and Vitrail only served them at the later moment, so
the game painted the colours itself underneath the pack's cloth. They are drawn with the pack's
translucent block program at the moment the game draws them, as under Iris.
  • Bliss-based packs draw again, Eclipse among them.** Three things stood in their way, the
first two enough to turn the whole pack off:
  • A pack may keep data in a one dimensional image. Bliss keeps a line of block data that way,
and the game's shader checks refused every program reading it, the pack's composites among
them. One dimensional images now pass those checks, as three dimensional ones already did.
  • A pack may define a macro twice with different bodies, which NVIDIA's driver accepts and the
compiler Vitrail uses does not. Eclipse's composite2 does it with diagonal3. Each use now
gets the body in force where it stands, which is the dri
...
### Added

  • K turns shaders off and back on**, as it does under Iris. Turning them back on returns to
the pack you had picked, and a line in chat says which way it went. If the pack cannot be drawn,
because it fails to load, is no longer in the folder or none was picked, shaders stay off and
the line says why, so the next press tries again. The key can be moved in the game's controls,
under Vitrail, beside the two that open the settings and reload the pack.

### Fixed

  • Distant Horizons' own clouds stay out of a pack that asks for that.** With Distant Horizons
installed, its blocky clouds were drawn over the pack's sky even when the pack writes
dhClouds=off, as Complementary does. They were hardest to miss under blindness, where the
pack's own clouds go dark and Distant Horizons' stayed bright. They are now held off for as long
as such a pack is loaded, as Iris does, and your own Distant Horizons setting is left as it was.
  • Distant Horizons' menu says who holds a setting it will not let you move.** Where a pack
draws the far terrain, Vitrail holds off Distant Horizons' own fog and ambient occlusion, and
its clouds wherever a pack asks. The menu showed those lines locked and "controlled by
UNKNOWN", and Distant Horizons wrote a warning in the log for each. They are now held under
Vitrail's name, on a Distant Horizons recent enough to take one.
  • Mining a block shows its cracks again on 26.3.** With a shader pack loaded, the crack overlay
never appeared and the block simply broke. 26.3 draws the crack over an ordinary block earlier in
the frame than 26.2 did, among the solid features, and Vitrail was only waiting for it among the
translucent ones. It is now drawn with the pack's gbuffers_damagedblock at either moment, so the
crack over stone and the crack over glass both show.
  • Banners show their colours and patterns again on 26.3.** With a shader pack loaded, every
banner was plain white cloth. 26.3 draws a banner's colour layers among the solid features where
26.2 drew them with the translucent ones, and Vitrail only served them at the later moment, so
the game painted the colours itself underneath the pack's cloth. They are drawn with the pack's
translucent block program at the moment the game draws them, as under Iris.
  • Bliss-based packs draw again, Eclipse among them.** Three things stood in their way, the
first two enough to turn the whole pack off:
  • A pack may keep data in a one dimensional image. Bliss keeps a line of block data that way,
and the game's shader checks refused every program reading it, the pack's composites among
them. One dimensional images now pass those checks, as three dimensional ones already did.
  • A pack may define a macro twice with different bodies, which NVIDIA's driver accepts and the
compiler Vitrail uses does not. Eclipse's composite2 does it with diagonal3. Each use now
gets the body in force where it stands, which is the dri
...
### Added

  • Minecraft 26.3.** The same source builds a jar for 26.2 and one for 26.3, and each jar refuses
the other game. On 26.3 it needs NeoForge 26.3.0.16-beta or later, or Fabric Loader with Fabric
API, and the Sodium 0.9.2 built for 26.3. On NeoForge, Complementary Reimagined draws there as it
does on 26.2: its terrain, water, shadows, sky, sun, moon and stars, mobs, the hand, clouds, rain
and snow, particles and composites, and the game's translucent features the pack does not serve
are composed into its image as on 26.2, and so is Distant Horizons' far terrain, land and water
both, with the pack's own dh_terrain and dh_water. Compiled shader modules are kept on disk,
so a second load of a pack skips the compile. The game's improved transparency is turned off
while a pack draws, as Iris turns it off on the other backend and as on 26.2. One thing is not carried over yet: a program with a geometry stage is
served only where that stage passes each corner on, which is folded into the stage after it, as on
a Mac on either game, and any other such program is set aside with a line in the log.
  • The compiling notice in the top-left corner can be turned off.** A Compile Notice switch on
Vitrail's page of the video settings hides the pulsing mark and its "Compiling shaders..." words.
It is on by default, the pack compiles exactly as before either way, and the F3 screen still
says when it is compiling.

### Changed

  • Shadow Reuse is off by default.** The shadow map is drawn again on every frame, as Iris draws
it, so the frame rate you read is the one of the same shadow work. The setting is still on the
engine page for anyone who wants the frames it wins, by keeping the ground of the map for one or
two frames. A value you already set yourself is kept.

### Fixed

  • World space reflections show the blocks they reflect instead of black.** A pack can name one
of the game's atlases as a texture of its own, and Complementary Reimagined colours its world
space reflections from the block atlas that way. An atlas is built while the game runs and is no
file of any resource pack, so Vitrail found no file and bound one black texel in its place, and
every block reflected from off screen came out black. A texture the game holds under that name
is now bound as it stands, as Iris binds it.
  • Coloured lighting works on a Mac.** Vitrail no longer tells a pack it is running on a Mac.
Packs read that as Apple's OpenGL driver and switch off what it lacks: Complementary Reimagined
turned its coloured lighting (Advanced Color Tracing) off and painted an error over the picture
when it was asked for. On a Mac Vitrail draws through Vulkan on Metal, which has what the
setting needs, so it now works there, and so do the improved rain and the rest of what the pack
held back for Apple's driver.
  • Shadow comparisons are enabled on a Mac.** The sampler a pack's shadow lookups compare through
is one a Mac's Vulk
...
### Added

  • Minecraft 26.3.** The same source builds a jar for 26.2 and one for 26.3, and each jar refuses
the other game. On 26.3 it needs NeoForge 26.3.0.16-beta or later, or Fabric Loader with Fabric
API, and the Sodium 0.9.2 built for 26.3. On NeoForge, Complementary Reimagined draws there as it
does on 26.2: its terrain, water, shadows, sky, sun, moon and stars, mobs, the hand, clouds, rain
and snow, particles and composites, and the game's translucent features the pack does not serve
are composed into its image as on 26.2, and so is Distant Horizons' far terrain, land and water
both, with the pack's own dh_terrain and dh_water. Compiled shader modules are kept on disk,
so a second load of a pack skips the compile. The game's improved transparency is turned off
while a pack draws, as Iris turns it off on the other backend and as on 26.2. One thing is not carried over yet: a program with a geometry stage is
served only where that stage passes each corner on, which is folded into the stage after it, as on
a Mac on either game, and any other such program is set aside with a line in the log.
  • The compiling notice in the top-left corner can be turned off.** A Compile Notice switch on
Vitrail's page of the video settings hides the pulsing mark and its "Compiling shaders..." words.
It is on by default, the pack compiles exactly as before either way, and the F3 screen still
says when it is compiling.

### Changed

  • Shadow Reuse is off by default.** The shadow map is drawn again on every frame, as Iris draws
it, so the frame rate you read is the one of the same shadow work. The setting is still on the
engine page for anyone who wants the frames it wins, by keeping the ground of the map for one or
two frames. A value you already set yourself is kept.

### Fixed

  • World space reflections show the blocks they reflect instead of black.** A pack can name one
of the game's atlases as a texture of its own, and Complementary Reimagined colours its world
space reflections from the block atlas that way. An atlas is built while the game runs and is no
file of any resource pack, so Vitrail found no file and bound one black texel in its place, and
every block reflected from off screen came out black. A texture the game holds under that name
is now bound as it stands, as Iris binds it.
  • Coloured lighting works on a Mac.** Vitrail no longer tells a pack it is running on a Mac.
Packs read that as Apple's OpenGL driver and switch off what it lacks: Complementary Reimagined
turned its coloured lighting (Advanced Color Tracing) off and painted an error over the picture
when it was asked for. On a Mac Vitrail draws through Vulkan on Metal, which has what the
setting needs, so it now works there, and so do the improved rain and the rest of what the pack
held back for Apple's driver.
  • Shadow comparisons are enabled on a Mac.** The sampler a pack's shadow lookups compare through
is one a Mac's Vulk
...
### Added

  • A pack's three dimensional lookup table is served whatever it holds.** Some packs ship a block
of numbers rather than a picture, a table their shaders read in three directions: an atmosphere
sampled by height, by sun angle and by view angle, a noise field a cloud is carved out of. The
engine laid out the small ones and turned away any table written in full precision numbers, and
it read no pack file over eight megabytes at all, a limit meant for shader text. It also read
such a table only where the shader asked for it in the plainest of the two ways GLSL offers, and
a program that asked the other way was turned away with its table sitting ready in memory. A pack
hitting any of the three lost every program that read the table: on iterationT that was every
pass it draws the overworld with bar a handful, which left the bare picture on screen with none
of its sky, its clouds or its water put in. Such a table is now read to the length its own
declaration announces, however long the file is, at the precision the pack wrote it, and through
either way of asking.

Where a card cannot blend between two of those values, Apple's among them, the table is read at
its nearest entry instead and the log says so.

  • A pack's geometry stage is drawn.** Some packs put a third shader between the two the engine
builds every draw from, and use it to work something out per triangle rather than per corner:
how coarse the texture on a block face is, whether a sky quad is the moon or the sun. The engine
bound the first and the last and nothing in between, so the last one asked for values nobody had
written and the whole program was turned away: on iterationT that took the terrain and the moon
out of the picture entirely. Those programs now draw.

It needs a card that can run such a shader, which the desktop cards do and Apple's do not. On a
card without one, a geometry stage that only passes each corner of a triangle on is folded into
the shader after it, which is what iterationT's terrain stage does, so its ground is drawn on a
Mac too. That stage also works out how fine a block's texture is from the whole triangle, and the
folded shader works the same size out for each pixel instead. Any other geometry stage is named in
the log on such a card, and the world keeps the game's own shader for that program rather than
drawing it with its middle missing: iterationT's sun and moon stay with the game on a Mac, its
stage telling the moon from the sun by a measure of the whole quad that no single pixel can see.

  • A pack may now blend one of a pass's targets differently from the others.** A shader pack can
ask for a blend function per target rather than one for the whole program, and the engine read
those lines and then dropped them the moment two targets of one pass disagreed, putting the
program's plain function on all of them. Each line now lands on the target it names, which is
what decides the shap
...
### Added

  • Eight shadow colour buffers for a pack that asks for them.** A pack declaring
HIGHER_SHADOWCOLOR may now draw the light into shadowcolor0 through shadowcolor7 and read
them back, which is what Iris gives it. Before, a shadow program naming anything above
shadowcolor1 had its whole target list thrown away and drew into the first two instead, which
is still what a pack that does not declare the flag gets, exactly as under Iris. And only the
buffers some program of the pack names are allocated now, so a pack writing shadowcolor0 alone
pays for that one image where it used to pay for two.

  • Two more capability flags are announced and no longer refuse a pack**, HIGHER_SHADOWCOLOR
and SSBO. The storage buffers behind the second were already built and filled from a pack's
own bufferObject lines, and the name was simply never claimed, so a pack that declared it could
not be drawn at all. A pack requiring either, or both, now loads.

  • A pack can read the shadow map under a second, hardware-compared name.** shadowtex0HW and
shadowtex1HW are bound now, to the same two depth images as shadowtex0 and shadowtex1,
and each is compared by the hardware where the pack declares it that way. Both names read back
black before, and a pack declaring it cannot be drawn without SEPARATE_HARDWARE_SAMPLERS was
refused at load over that name alone. That name refuses nothing now, though a pack that also
requires a name this engine has not built is still refused, the log listing what it asked for.
Nothing changes for a pack that never writes the two names.

### Changed

  • Distant Horizons' far terrain is read out again only once it has changed.** Every frame a pack
drew turned that mod's whole listing of far sections into this engine's own records twice over,
once for the land and once for the water, which for a far view is thousands of sections a frame
and the same ones in almost all of them. The listing is now compared against the one the last
reading came out of, and the reading is reused where nothing in it has moved, so a camera
standing still over settled far terrain does the work once instead of on every frame. Walking,
a view distance changed, terrain finishing its generation, anything that really moves the far
view reads it again as before. The picture is the same, and none of this has been measured, so
it says work removed rather than frames gained.

  • Picking a pack freezes the game for less time.** Reading a pack walked the same shader files
over and over, once to find its directives, once for its chain, once for its chunk programs and
once more for each of its compute programs, and every one of those walks read the archive again
and pasted the same shared headers together again. A pack is now read once per file and each of
its programs assembled once for as long as it stays open, which is the wait before the picture
appears when you choose a pack, apply a se
...
### Added

  • A Cache Cap slider on the video settings page**, how much compiled-shader disk this
engine may keep, 128 to 2048 mebibytes in steps of 128. 512 MiB is the old hardcoded
ceiling and the default. Moving it applies at once, with no pack reload: lowering may drop
unused cached shaders. Written in vitrail/module-cache-ceiling.txt.

  • A Shadow Map Scale slider under Video Settings**, on the mod's page beside Max Shadow
Distance. The shadow map is drawn at the chosen fraction of the resolution the pack asked
for, 25 to 100 percent, and the setting outlives whichever pack is chosen. Moving it reloads
the pack, which is what lets the pack be told the smaller number instead of being left to
work against a map it cannot see.

It is a setting of its own rather than something the FSR Render Scale takes along with it,
because of what it does to the picture. The pack works out its shadow blur, its shadow bias
and where it reads the map from the size it was given, so a smaller map is a less defined
shadow, softer where the pack smooths its own and coarser where it does not, and an image
the pack's author never saw. That is a trade worth offering and not worth making on
somebody's behalf, so at 100 percent, which is where it starts, the pack gets exactly the
map it asked for and nothing of the setting runs. The engine says at load when the setting
is in force.

What the render scale reaches and what it leaves alone is now written down, in
docs/render-scale.md.

  • A switch that fills the shadow map from a box around you rather than the tight
silhouette.** An empty file vitrail/box-shadow-cull in the game folder, or
-Dvitrail.boxShadowCull=true. The silhouette stays the default, which is what other loaders
draw. The box was tried as the default, to stop leaf blocks popping at the sun's edge as you
move, and measuring it is why it did not stay: on one wooded scene it drew 875 sections where
the silhouette draws 322, and the frame ran twelve to twenty-eight percent slower depending on
how much stood around. It also stops bounding anything at all once Shadow Distance reaches
your render distance, which is where the slider sits at its maximum.

What the box covers up is a defect of this engine and the switch is not its fix: leaves can go
a frame without their shadow while you walk, if you run a mod that narrows what the game
considers visible. That is being fixed at its cause instead.

  • A switch that hands every sine and cosine a pack writes back to the graphics driver.** An
empty file vitrail/driver-trig in the game folder, or -Dvitrail.driverTrig=true. They are
normally replaced at load with a helper that keeps its accuracy over a whole world coordinate,
where a driver's own can shed the low bits and show as shimmer. The switch exists so the two
can be compared in one world rather than across two builds, and the log says which of them a
pack load ended up with either w
...
### Changed

  • The link under an empty pack folder opens the CurseForge shader search.** It used to open
the shader page on Modrinth, where this mod is not published.

### Fixed

  • The game no longer crashes when resources reload with a pack loaded.** Moving
Anisotropic Filtering or Texture Filtering under Video Settings, switching resource packs
and pressing F3 + T all reload every resource, and any of them took a world with a
shaderpack on straight to the crash screen, on "Pipeline is not valid".
The sky is drawn first in the frame and was the piece that fell over, but nothing the pack
draws was safe. The reload now costs what it always should have, a few frames while the
programs compile again.

  • A pack swapped while the engine was still warming up could kill the worker that compiles
the leftover programs ahead of their first draw. Those programs then paid for themselves
at the first frame that needed them, which is a stutter where there had been none.

  • Mellow draws again.** Since 0.7.5-beta the pack loaded, laid out its settings and then
drew nothing at all, the game's own picture staying on screen. One of its fullscreen
passes was refused at compile, and a pack one of whose passes does not compile draws
nothing at all. What that pass builds its outline from is a number its own settings fix
before anything is compiled, and the engine was treating it as one that could still
change. Any pack that writes a constant that way was open to the same.

  • E-LITE compiles whole.** Twenty of its programs were refused, because one value the
engine supplies reached the shader a second time where the pack had already named it
itself. A line that names several values at once is now read to its end, so nothing is
supplied over a name the pack wrote.

  • A pack could come up with something wrong smeared across the picture, and stay that way
until it was loaded again.** Not a flicker and not a glitch that passes: a patch of colour
or noise that is simply there, on a machine where it happens and never on the one next to
it. What was behind it: the images a pack draws into are wiped once when they are built, at
every pack load and again whenever the window changes size, and that wipe was ticked off
the list the moment it was scheduled instead of when it happened. One frame that drew none
of the pack lost it, and the seconds a pack spends compiling are exactly those frames. The
images a pack carries from one frame to the next are never scheduled again after that, so
they kept whatever the graphics driver had left lying in them.



### Added

  • An FSR Render Scale slider under Video Settings**, on the mod's page beside Max Shadow
Distance. The world renders at the chosen fraction of the window, 25 to 100 percent, and the
finished image is brought back to full size with AMD FidelityFX Super Resolution 1.0 before
the interface is drawn, so menus, chat and the F3 screen stay sharp whatever the scale.
Moving the slider takes effect immediately, the setting outlives whichever pack is chosen,
and at 100 percent, or with shaders off, nothing changes at all.

  • A pack's coloured lighting runs.** The storage images, storage buffers and shadow compute
pass behind it are served, and IRIS_FEATURE_CUSTOM_IMAGES is announced, so the voxel
lighting of Complementary's top profiles, Euphoria Patches' Colored Lighting among them,
draws instead of switching itself off behind a red overlay: lamps and torches colour the
world around them. A pack that requires custom images loads instead of being refused. And
that light holds still as you move: the glow of ores and lava used to flicker at every block
crossed, worst going up, a ring of dark on each jump and a shimmer in upward flight against
nothing at all on the way down, with a placed torch never showing it only because the
ordinary block light covers it over.

  • A crash during startup no longer takes the graphics backend with it.** The game resets the
preferred graphics API and the fullscreen mode after any startup that did not finish, whatever
crashed, and nothing of this mod draws off Vulkan, so one crash used to cost a restart to set
it back by hand. A selector under Video Settings picks what to come back to, Vulkan unless
told otherwise.

  • A switch that puts the game's own wait back after every render pass.** A pack's passes end on
a wait naming what the next one reads and writes, rather than on the game's wait for the whole
of memory. That is what makes the frame cheaper, and it is also the kind of thing a driver can
honour by accident: a wrong image on one machine and a right one on another is exactly what a
missing wait looks like. An empty file vitrail/full-pass-barrier in the instance, or
-Dvitrail.fullPassBarrier=true, puts the wide wait back on both roads where one was traded
away, the close of a pack's pass and the filling of a mip chain. Slower, and it cannot be the
cause of anything, so an image that comes right with it has named the problem.

  • The log names the first full frame's GPU stops.** One line per pack load, always on: how many
render passes opened, how many textures were cleared and copied, then the labels, most frequent
first. That is the number a Mac trace of queue submits is counting.

  • The F3 screen says what the shadow map cost.** Two lines beside the version and the pack:
how many world sections were drawn into the map out of how many are loaded, at what render
distance, and what the walk for the light measured against. They are Iris's li
...
Thanks to [@DanielWQY](https://github.com/DanielWQY) for opening the Mac report, and to [@Proton0](https://github.com/Proton0) for running the test jars until Complementary actually compiled. I don't have a Mac here, that fix doesn't ship without them.

### Added

  • A GPU profile of the frame, per render pass, in the log.** Start the game with -Dvitrail.passTimings=5 among the JVM arguments and every five seconds the log gets a table of where the card's time went, one row per pass label, the game's passes and Sodium's beside the pack's, sorted by cost. Off unless asked for. What a slow pack costs is now a question the log answers instead of a frame counter.

### Fixed

  • A pack that declares many textures and samples few of them can compile on Apple Silicon.** Metal only has sixteen sampler slots, numbered by the order the shader first names each texture rather than by how many it actually reads, so a used texture sitting behind unused declarations used to land on slot 17 and the pipeline was refused. The names a program samples are now declared first. A program that samples more than sixteen textures still cannot run there.

  • A pack that marks a computed matrix as const loads instead of falling back to vanilla.** Vulkan will not take transpose of a literal, or a uniform, as a constant initialiser, and one such pass used to fail the compile and take the whole pack with it. The keyword comes off and the value stays. Seen on Lux v1.2, a BSL derivative.

  • Sodium 0.9.2 no longer crashes when a pack extends the chunk mesh.** Its new arena allocator was sized for Sodium's own twenty bytes and refused the wider mesh a pack needs. The allocator now takes the same format the rest of the renderer already asked for. 0.9.1 is unchanged.
### Changed

  • On a backend other than Vulkan, nothing of the pack is drawn any more.** The pack is still
read and still shown in its settings screen, so it can be picked and configured ahead of the
restart, but the game keeps its own image: the passes used to run there and draw a picture that
was credible and wrong. A chat line the first time a world is shown says so and names the setting
to change, Graphics API to "Prefer Vulkan (Experimental)" under Video Settings, beside the error
the log already carried.

### Fixed

  • Body Camera's film grain moves again.** The 0.7.3 hash rewrite took the frame time out of
the grain, which writes it into the second argument of the idiom, and left a pattern stuck to the
screen. The rewrite now only fires on a constant second argument; BSL's waving is untouched.

  • No more dark oval under a mob when the pack draws its own shadows.** The game's flat entity
shadow was still drawn, lit as a translucent entity, under every mob the pack was already
shading with its shadow map. It now goes away for as long as the pack has a map, which is what
Iris does, and stays under a pack without one. The defect only showed with Entity Shadows on in
the video settings.



### Fixed

  • Grass and leaves no longer skip while they sway under BSL.** Packs that hash their waving
with a huge sine were jumping on this backend and smooth on the reference. That hash is now
taken from the vertex bits instead. Complementary was already smooth; it never wrote that
idiom.



### Fixed

  • The hand and the entities no longer stretch into giant triangles after a pack turns on or
off.** The 0.7.1 entry below called what its crash fix left behind cosmetic and brief, and it
was neither: the game's own entity pipelines keep the previous vertex layout until a resource
reload, so anything they drew over the rebuilt mesh, the hand with its switch off, every mob
and hand for the seconds a chain takes to compile, smeared across the screen and stayed that
way for the rest of the session. The engine now takes those pipelines out of the device's cache
the moment the layout moves and compiles them again on the spot; what left the cache is freed
at the next reload, the one safe moment the crash fix established, so the crash stays gone.



### Fixed

  • Removing, picking or reloading a shader pack in a running world no longer crashes the game.**
The 0.7.0 entry below said the crash was reduced and not gone, and this closes what remained,
which was two more faults of the same family. A reload freed the pack's images a moment before it
stopped answering for them, so a pass of that very frame could still be handed them; and loading
a pack that draws the entities or the hand emptied the graphics device's whole pipeline cache at
an instant where work already recorded still named what was destroyed. Nothing empties that cache
any more: the game does it itself on every resource reload, which is the one moment it is safe.
What that leaves is cosmetic and brief: after turning a pack on or off in a world, an entity or
the hand drawn by the game's own shader can look wrong for the second or two a pack takes to
finish compiling, and a resource reload clears it. Tried at length on both loaders, turning packs
off and on and switching between four of them, where one to four such gestures used to end the
session.



### Changed

  • Distant Horizons no longer draws its own ambient occlusion and fog while a pack is drawn.**
Between them they are three full screen passes over an image nothing downstream reads, so their
work was thrown away one pass later, and two of the three ran over the whole screen rather than
leaving it early. Both are on unless the DH menu says otherwise, so an install that changed
nothing was paying for them on every frame. They go back to whatever that menu says the moment a
pack is unloaded.

  • Three things taken on every frame are now taken when something reads them.** The search for a
lightning bolt walked every entity the world would draw, on every frame, to find the one kind of
entity that is almost never there; it runs once a tick now, which is the rate the reference
publishes that value at. The count of what the camera saw was taken on every frame for a line
printed once per pack. And the pack's number for an item was spelt out again at every submission,
where the number for a kind of entity had been remembered since it was written.

### Fixed

  • Turning the shaders off and back on, or picking another pack, takes the game down far less
often.** Two rings the far terrain writes its section corners into were closed the moment a pack
was unloaded, while a pass already recorded still held slices of them, and the graphics device was
lost a few seconds later with nothing in the log to say why. They belong to the engine now rather
than to the pack, so a load has nothing to close. It is not the whole of that crash: a second
fault of the same family survives it, and where the pack could not be put back once before, it now
takes somewhere between one and four goes. Issue 111 follows what is left, and until it is closed
a pack changed in game remains a thing that can end the session.

  • The same pack now translates to the same text on every start.** Four tables the translator
walks to write a shader were handed back in an order the runtime picks afresh each time the game
starts: the varyings a stage is owed, the vertex inputs a mesh has not got, and the volume
helpers a pack's three dimensional textures need. Two launches on the same pack could therefore
produce shaders that differ only in the order of their declarations, which is the same shader to
a reader and a different one to the game, so it compiled pipelines it already had. One warning
line about mesh elements a program computes from and does not get also listed its names in a
different order each run.

  • One character no editor should have written no longer costs the player every pack.**
vitrail/options.txt was read as strict UTF-8, so a single byte from another encoding stopped
ANY pack from loading, under a message that named neither the file nor the encoding. A byte order
mark, which several editors add on their own, threw nothing and quietly ate the first setting of
the file. Both now cost one character of one val
...
Vitrail Shaders Icon
Download Vitrail Shaders
Select game version
Select platform