Releases: avpbynf/Vitrail-Shaders
Release list
v0.8.1-beta
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.
v0.8.0-beta
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, andIRIS_FEATURE_CUSTOM_IMAGESis 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 filevitrail/full-pass-barrierin 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 lines for the same
thing, in the same shape, so a screenshot under one reads against a screenshot under the
other, and nothing has to be switched on for them to appear.
Changed
-
Chloride is no longer required, on either loader. One thing was behind that requirement:
NeoForge opens a loading window before the game exists, that window carries an OpenGL context,
and the game takes it over instead of making one, so the Vulkan surface was asked for on a
window built for OpenGL. Vitrail now refuses that window itself when the backend is Vulkan,
takes it off FML's hands at the end of mod loading, and closes it once the game has drawn its
first frame. Fabric opens no such window and never needed the help. Chloride remains worth
installing, its settings are still read and reported, and running it alongside changes nothing. -
The odd corners of a pack's properties read the way Iris reads them. An
alphaTest., a
texture.noiseor adimension.propertiesline written under a setting's#ifnow comes and
goes with the setting, a world declared twice keeps the last declaration instead of the first,
a page laid out twice keeps its last line instead of both, and a pack writing
shadow.enabled=falsegets what it asked for: nothing is ever drawn from the light. No known
pack is changed by any of this today. -
The settings screen reads a pack's layout the way Iris does. The
*token now pours out
every setting no other page names, where the pack put it; a pack without ascreen=line gets
one page holding everything instead of an empty one; and a name Iris refuses to configure, a
constant off its closed list, a toggle nothing tests or a value without a list of choices,
shows the same blank it shows there instead of becoming a slider or a toggle Iris never had. -
Opening a pack's settings no longer applies it. Looking at another pack's pages used to
load it first, on its own default profile, so opening a heavy pack to turn it down paid the
heavy profile in full. The pages now open on the pack that was picked while the loaded one
goes on drawing; Apply is the only thing that costs, and a profile chosen before applying is
the one that lands. -
The shadow walk no longer rotates Sodium's command ring a second time in the same frame.
The lists still reset so the light does not append onto the camera's; the ring waits for the
next camera walk. Same shadows. -
A pack's frame opens fewer GPU stops. Clears ride as the first pass's load, leftover
sampled-before-write clears share one empty pass per size, mip chains blit instead of drawing
each level, consecutive geometry that writes the same images stays in one pass, ping-pong
targets swap names instead of copying texels back, and our own passes end on a wait naming what
the next one samples and what it writes, rather than on the game's wait for the whole of memory.
Same picture. Written for the extra submits a Mac report was counting; whether the frame rate
moves is still that machine's to measure. -
The frame that rebuilds the pack's programs pays far fewer clears. A dimension change, a
world join or a pack switch re-prepares every geometry program the scene draws, and each one
rebuilt its own copy of the same one-texel constants, one standalone clear per texture: about
ninety full GPU stops on that single frame, felt as the hitch at a portal. The constants are
now built once and shared, and the same frame measures nine. -
Pass uniforms reuse scratch matrices instead of allocating a model-view-projection and a
normal matrix on every fill, Sodium region draws skip leftover sampled clears once nothing is
still owed one, and the shadow sweep reuses its plane scratch. Same picture, same numbers. -
Improved transparency is turned off while a pack draws, the same refusal Iris makes. That
option opens a second colour target for translucent items, and every leftover feature that
writes it is an Immediate draw this engine would otherwise keep as its own GPU stop. -
Leftover Immediate draws and Distant Horizons' GenericObjectRenderer stay in the geometry
pass already open, the way Iris leaves the default framebuffer bound. A leftover pass is
never adopted: its viewport and scissor would be whoever opened it. -
Geometry programs compile during the same warm-up as the chain, before the pack is drawn:
families translate on a worker while composites compile, and the world waits until the
composites and the terrain are in the device cache. From there the leftover families compile
in the background, described under Fixed, and the pulsing mark in the corner carries the
state from the held world to the last word of the closing show. -
The wait for a pack skips the world, not the HUD. Several programs compile a frame instead
of one, so the wait is not a two-frame-per-second vanilla picture of the same work.
Fixed
-
The freezes on first encounters are gone. A pack's programs for the entities, the sky, the
clouds, the weather, the particles and the far terrain used to compile on the frame that first
drew each of them: around half a second frozen per program on a cold driver cache, over a
hundred programs on a big pack, spread across the first minutes of play and paid again behind
every portal. They are now compiled in the background while you play, several families at
once, and a frame only waits for a program it reached before the background did. While that
work runs, the Vitrail mark pulses in the top-left corner of the screen with "Compiling
shaders..." and the running count beside it, the way the autosave floppy used to blink; when
the work ends, "Shaders compiled!" stands beside the mark for a moment and the corner fades
back to the game. An empty file
vitrail/keep-first-draw-compilesin the instance puts the old path back for a comparison. -
A pack's shadow compute is no longer built when the pack switched it off. A pack turns
whole programs on and off from its own settings, and the compute pass behind coloured lighting
was read and handed to the compiler whichever way that setting stood. Switched off, the pack
also takes away the colour tables and the image formats that pass reads, so what reached the
compiler was not a shader at all and it was refused. The refusal came out as a warning, and
there was nothing on screen to say a pass had been meant to run. BSL with its multicoloured
blocklight off, Bliss, and both Complementary outside their coloured lighting profiles were all
in that state. -
A pack's storage images keep the words it wrote around them. Translation rebuilt those
declarations from the type onwards and droppedwriteonly,readonly,restrictand
coherenton the way, whichever side ofuniformthe pack put them. On Vulkan the first of
those is what makes an image with no declared format legal at all, and it is the one t...
v0.7.5-beta
Thanks to @DanielWQY for opening the Mac report, and to @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=5among 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
constloads instead of falling back to vanilla. Vulkan will not taketransposeof 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.
v0.7.4-beta
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.
v0.7.3-beta
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.
v0.7.2-beta
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.
v0.7.1-beta
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.
v0.7.0-beta
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.txtwas 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 value at worst, andvitrail/pack.txtis read that
way too. That file is also written through a temporary and moved into place, so a crash while it
is being written can no longer leave half a line behind, which read as no pack chosen at all. -
The shadow distance now bounds every chunk it is meant to, and not only the ones weighed one by
one. A group of chunks that merely reached into the distance was handed to the walk whole, so
everything standing under that group was drawn into the shadow map however far past the distance
it stood. Lowering the distance, from the pack or from the video settings, therefore saved less
than it should have, on the second walk of the world, which is the most expensive thing a frame
does here.
v0.6.0-beta
Added
- Distant Horizons' far terrain now casts into the pack's shadow map. A pack that ships a
dh_shadowprogram has it drawn, from the light, over the same distant land itsdh_terrain
draws for the camera, so a far hill lays a shadow on the ground instead of only shading itself
out of its own depth. Packs that writedhShadow.enabled=falseare taken at their word, which is
most of them; the one pack tried here that ships the program keeps it behind a setting of its own
and it has to be switched on. It also follows the two words that govern the near world in the map,
so a pack that keeps the world out of its own shadow map keeps the distant land out with it. What the map holds is the distant land the camera can see, which is
narrower than under Iris: that mod gets a second list of it, built for the light, and there is no
second list to be had here.
Changed
- Two things taken on every frame are no longer taken for a pack that cannot read them. The
copy the shadow map is read from asshadowtex1is sixty-four mebibytes a frame at a shadow map
of 4096, and the depth kept from before the hand is a full screen image and a draw on every frame
the hand is drawn. Each is now skipped where no file of the pack writes the name that reads it,
which the log says out loud when it happens. Of the eight packs tried here, one skips the shadow
copy and five skip the depth.
v0.5.0-beta
Added
- The debug screen names the engine, the pack and its profile, where Iris has always put those
three lines. A screenshot taken with F3 open is how the question "what drew this, with what, set
how" arrives, and until now a Vitrail frame and an Iris frame of the same pack read as the same
picture. A pack that is not being drawn says which of the three reasons it is rather than reading
as none at all: shaders switched off, a pack named that is not in the folder, or a pack the
engine refused, the last of which sends you to the log rather than to the settings screen.
Changed
- One download for both loaders. The release now carries a single jar,
vitrail-<version>+mc<minecraft>, that runs on NeoForge and on Fabric alike; each loader reads
its own metadata out of it and ignores the rest. It is the same engine the two per-loader jars
carried, in one file, and the per-loader downloads stop being published. Nothing changes in
game, and nothing changes about what has to sit next to it: Sodium, Chloride, and on Fabric the
Fabric API. Upgrading means replacing: delete the oldvitrail-neoforge-*orvitrail-fabric-*
jar when this one goes in, because the two carry the same mod and a loader that finds it twice
refuses to start.
Fixed
-
Complementary no longer falls back to its oldest code paths. The engine told packs it was
Iris but never which one, and a pack that asks compares against zero: every "on an old Iris, do
it the old way" branch in Complementary Reimagined and Unbound was live. The engine now
announces the Iris release it behaves like, so those branches pick the modern side: rain and
thunder fade over the pack's own timer instead of a hardcoded three seconds, the sun and moon
stop leaning on a workaround for a renderer bug this engine never had, and reflections drop a
workaround for a texture bug fixed before the release this engine mirrors. -
On Fabric, the game no longer throws away every selected resource pack at boot when a slow
mod set is installed. Reading the shader pack used to hold up the very first frame, and when
the boot's resource reload finished inside that pause the game stitched its atlases before it
had a frame's uniforms to do it with: "Missing uniform Globals", and every resource pack was
deselected. Seen with Distant Horizons installed, whose extra programs made the pack read long
enough to lose the race. The pack is now read once the boot reload is over, which is where
NeoForge always effectively had it. -
Bliss no longer stands its swamp fog over any shoreline. Biomes were numbered by walking the
level's registry, which hands them out alphabetically, while a pack compares against the numbers
Iris hands out, which are the game's own declaration order. Six is swamp there and cold ocean
here, so the green followed you along every coast. The numbering is now taken where Iris takes
it, and a biome the game's own list never declares answers nought, as it does under Iris. -
Distant Horizons terrain stops washing out flat under packs that read the light raw. The far
terrain family was handed raw light levels scaled by sixteen; Iris hands level i as
(i + 0.5) / 16 and answers the fixed function light matrices with the identity, so a pack reading
that light through the matrix or raw gets the same number either way. BSL and Complementary
multiply the matrix in and were never affected. Bliss reads the pair raw, and from sky level one
upward its light map saturated and its far terrain went flat. -
Under Bliss, the game's sky no longer paints over the far terrain. The engine fills the
game's own frame back in wherever the world's depth stands in front of what a pack claimed, and
the world's depth holds nothing where an LOD stands, the game never rasterising the far terrain
itself: those pixels read as unanswered and were covered over the colour the Distant Horizons
programs had just written. Only Bliss showed it, its sky pass being the one the translation
cannot hand a coverage mask to, every other pack's sky claiming those pixels itself. The far
terrain's own depth is read now. -
The line printed when the game came up on OpenGL no longer says the pack draws nothing. The
passes do run on that backend, and what they draw is a picture both credible and wrong: the
programs are translated against Vulkan's depth and clip conventions, so a sky cut in two or a
misdrawn hand there is the backend and not the pack. The line owns that now, which is the point
of it, a report filed against the pack being the one thing it exists to prevent.