Repository navigation
Releases: avpbynf/vitrail-shaders
Release list
v0.13.0-beta
Added
Kturns 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'sgbuffers_damagedblockat 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 withdiagonal3. Each use now
gets the body in force where it stands, which is the driver's reading. - A geometry stage that only passes each corner on is folded into the stage after it on a Mac.
Eclipse's terrain writes that stage in a shape the fold did not read (a block of varyings read
one corner at a time, a counter declared ahead of its loop, the position held in a local), so
the pack's terrain program was set aside and the terrain drawn without it. It is folded now.
- A pack may keep data in a one dimensional image. Bliss keeps a line of block data that way,
- A held item no longer streaks while the player walks, on a Mac. Under Photon the item in hand
carried short light dashes, one column every 32 pixels, for as long as the walk bob kept it
moving. Vitrail puts the game's own picture wherever something the game drew stands in front of
the pack's geometry, and it tells the two apart by comparing the depth the pack's fragment stage
saw with the depth the GPU stored. On a Mac the two can differ by a unit in the last place on
some pixels of a sloped surface, so those pixels read as covered and got the game's colour in
place of the pack's gbuffer. A difference that small no longer counts as something in front. - The sky no longer turns one flat pink when far terrain is loaded and none of it is in view.
With Distant Horizons, or a mod standing in for it, a pack is told there is far terrain and reads
its depth. On a frame where none of it is on screen, such as looking at the sky from above the
world's build height, Vitrail handed that depth over as a single texel. Photon reads it pixel by
pixel, found far terrain at the camera everywhere past that texel, and painted the whole view in
one pinkish colour. The depth is now the far plane across the whole screen, as the mod's own
image is under Iris. - A beacon beam's core no longer stops sixteen blocks above the camera. With the pack drawing
the sky, the bright inner beam ended at a flat line sixteen blocks over the player's eyes that
rose and fell with them, while the faint outer glow went on up. Vitrail lets the game's own
picture through wherever the game drew something in front of the pack's, and it took the sky to
stand where the game builds it, sixteen blocks up, so whatever the game drew above that height
lost to the pack's sky. The sky now counts as infinitely far away, as it does under Iris, which
also lifts the same cut from the End, where the game builds its sky a hundred blocks out. - The name of a player behind a wall shows again with a pack on, on Minecraft 26.3. The game
does not hide the name of a player standing behind a wall, it dims it, and 26.3 draws that
dimmed name on its own after the water and the outlines. Vitrail was not catching that last
draw, so the name went into the game's own picture, which the pack's final pass paints over,
and it was simply missing. It is now drawn by the pack like the name of a player in the open,
dimmed as the game dims it. The name of a sneaking player stays hidden behind a wall, as it is
without a pack.
Thanks to elNino0916 for the toggle key, the Distant Horizons clouds and the crack, Jolymmiles for
the Bliss-based packs and the test net, JakobMusix for the beacon beam, DebZakari for the names
behind walls, and Heerless for digging into the bells crash.
v0.12.0-beta
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 owndh_terrainanddh_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 Vulkan driver only accepts once a feature of its portability rules is enabled, and
nothing enabled it. The driver drew the lookups anyway, but a launch under the Khronos validation
layer had them refused, and the terrain was then drawn with stale textures until the game
crashed. The feature is now enabled wherever those rules apply. - Moving blocks are drawn through the shader pack instead of falling back to the game's shader.
Falling blocks such as sand and blocks carried by pistons use Minecraft's moving-block pipelines,
which were not served by the pack. They are now routed to the same shader programs Iris uses for
those pipelines and carry what Iris gives them: the real light map, the normal of each face, its
tangent and the other terrain inputs a pack lights a block with. - SEUS PTGI HRR 3 is no longer set aside as soon as it loads. Its anti-aliasing header carries
a comment giving example settings for other platforms, and the engine read those examples as if
the pack had set them. It then took the code meant for those platforms as the code in use, left
the three programs that include the header without the pieces they call, and since those could
not be built, drew nothing of the pack at all. A line inside a comment no longer decides which
code is in use, nor sets a name. What a pack writes inside a comment about its own buffers, their
format and their mip chain, is read in full as Iris reads it, so Complementary Reimagined and
Unbound with EuphoriaPatches get the buffers their text asks for. - Photon no longer crashes the game with its water parallax on. Looking along the water surface,
as when swimming just at it, the pack's waves were computed far out along the view, the engine's
own sine came out enormous there, and the pack's water kept stepping until the graphics driver
gave up and the game closed with a lost device. The sine now stays between minus one and one for
any value, as the driver's does, and nothing changes wherever it already did. - Photon loads with cloud shadows turned off. The pack stops one of its programs with an error
message when that setting is off, a message Iris only writes to the log. The engine handed it on
to the shader compiler, which refused the program, and the whole pack with it. Such a message no
longer stops anything, and the pack loads. - A full screen program reading the quad's corners by their core profile names draws. A pack
readingvaPositionorvaUV0in a core profile composite, deferred or final was handed
nought for both, so a program that placed its corners from them compiled and drew nothing. Both
now read the quad's own position and texture coordinate under the type the pack declared, as
under Iris. - A properties file's own defines now count for its sizes, uniforms and identifiers.
A#defineor#undefwritten there was ignored, so a later condition on that name was decided
as if it had never been written, and an image size, a custom uniform or an item or entity
identifier using it came out wrong or not at all. All of them now read the name as the line
above left it, as under Iris. Complementary with Euphoria Patches is the pack that shows it: its
profiles that set entity shadows to off now turn them off. - A compute reading a texture that could not be loaded still runs. A pack naming a texture
that could not be read lost every compute pass reading it, taken out of the frame. Such a
compute now reads what the full screen pass beside it reads, and runs. A game texture that no
loaded resource pack ships and the game does not hold either now reads the game's missing texture
in every pass, as under Iris, where it read black. - A pack image that cannot be read no longer turns a buffer black. When a pack replaced one of
its buffers with an image of its own and that file did not open as a PNG, every pass
reading that buffer read black. The buffer now keeps what it held before, in full screen,
compute and world passes alike, as under Iris, and the log names the image. - Shadows no longer sway with the view bobbing after the player is hurt. Being hit while
walking tilts the camera in a way the engine took for a matrix that was not the world's, and from
then on, for the rest of the session, it handed packs the walk bob inside the projection rather
than beside the camera. BSL and Bliss rebuild positions on screen assuming the projection has no
bob in it, so their shadows, and anything else placed that way, slid with every step. The bob now
stays where packs expect it, as on Iris, whatever tilts the camera. - iterationRP draws its lighting. Its lighting programs store into the pack's buffers from
full screen and world passes rather than from a compute, read its light volumes as integers
where they were stored as colours, and name several of them through the pack's own defines.
None of the three was served, so the scene stayed dark. All three are now served as under Iris,
and a program whose buffer or view this graphics card cannot store into is set aside with a
line in the log saying so. - The pass timings table reads real times on a Mac. With
-Dvitrail.passTimingsset, every
pass read nought on Apple hardware, the timestamp store it asked for being larger than Metal
holds. It now asks for one Metal accepts, and each pass reads the card's own time.
v0.11.0-beta
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 shape of anything drawn over something else: an overlay that should multiply, a
surface that should add, a second target written straight through while the first blends. The
shadow map is in, the same as anywhere else.With it,
PER_BUFFER_BLENDINGis served, so that name alone no longer turns a pack away. It
needs a driver that lets the targets of one pass differ; where there is none the name is refused
as before and the whole-program function stands, which is the ground Iris refuses it on too. -
Temporal Fold, a new setting on the engine page. A world drawn at a lower render scale loses
the thin things first, and those are what crawls as you move. The upscale cannot put them back,
because it only sees one frame. This blends each frame with the ones before it, matching every
pixel to where it stood a frame ago, so detail one frame missed can come from the frames before
it.It is off until you turn it on, and the checkbox is greyed out at a render scale of 100 percent,
where there is nothing to rebuild. It costs two more passes and three more images, about 40 MiB of
them at 1920x1080. Things that move on their own can leave a faint trail, because the match is
worked out from the camera and not from what each object did. -
Shadow Reuse, a new setting on the engine page. Filling the shadow map means walking the whole
world a second time, for the sun, and it is the most expensive thing the frame does. Between two
frames of a player standing still nothing in that map moves, so it is now kept and reused instead
of drawn again, and the passes that sample it are handed the matrices of the map they actually
have. Measured on a Mac mini M4 with Complementary Reimagined at its defaults, in a savanna beside
a village, in a window of 854x480 with a shadow distance of 32: 116 frames a second with the map
drawn every frame, 133 with it kept. Those figures belong to that window and that distance, not
to every setup: on flat ground with little to draw into the map, putting the kept map back can
cost more than drawing it, and turning the setting off is then the faster choice.It does nothing on a pack that voxelises into its shadow pass, which Complementary Unbound and
Photon do with their coloured lighting on. A pack whose shadow programs fill a volume the rest of
the frame reads has to fill it every frame, so the engine refuses the reuse there and says so once
in the log. That is decided from the shadow programs as the pack's settings leave them, so what is
left is every pack that does not voxelise, and the same packs with coloured lighting off.What is kept is the ground alone. Everything that moves, a mob, a boat, your own shadow, is drawn
into the kept map afresh on every frame, so none of it is ever late. The price is on the ground
itself: a block you place or break casts the shadow it had for as many frames as the setting
keeps. One frame is what it ships at, and the slider goes to two and stops there. Turning it off
restores the previous behaviour exactly. -
A pack that ships no
finalprogram now draws. Some packs end their chain on their last
composite and expect what it wrote to be the picture; they were refused outright, with nothing on
screen. What the chain leaves incolortex0is now brought to the screen, which is what Iris
does with the same packs. I Like Vanilla and Pegasus were both refused for it, and both now load.Neither loaded in a released version, so nothing else they needed was ever visible either. I Like
Vanilla reads the screen under one of the game's texture names, which the entry on those names
covers, and on a Mac its water declares the values it hands on through a shorthand of its own,
now read like the full spelling, where one of them would otherwise take the place of the next and
Apple's graphics refuse it. Pegasus defines one of its settings twice under two values, which
refused every program of it; where the two cannot be told apart the later one now stands, as a
driver takes it, and where a use sits between them the pack is left exactly as it wrote it. Its
terrain, its water, its entities and its particles needed two things more. It builds its texture
reads out of shorthands of its own, and the nametextureinside them was left as written while
the engine renamed it everywhere else, so those passes read a name nothing declared; the
shorthands are renamed with the rest now. And it compares settings against numbers with a decimal
point, "if the falloff equals 1" with the setting at 1.0, and those lines were read as whole
numbers and then refused. They are now reduced the way a driver reduces them. -
Compute passes are announced as a capability. They have been running for a while, so a pack
that says it cannot draw without them was being refused for something it would have got. Clarity
and Noble now load.More stood between those two packs and their picture, and none of it was ever visible in a
released version, since neither pack loaded at all. Clarity spells the matrix that places a
texture under a plain name rather than the old fixed function one, and nothing here answered that
spelling, so every corner of the sun and of the moon was handed the same texture coordinate and
both came out flat; it also lost two compute programs to a setting
compared against a number with a decimal point, the same reading the Pegasus paragraph above
describes. Noble names, in the shader itself, the format of the image that shader writes to, and
that word was being dropped as the declaration was moved to where this backend wants it, so the
pass never built and nothing wrote its screen space reflections.Noble keeps what each surface is made of as whole numbers packed out of its colours. Apple's
graphics store and read those numbers wrong, so on a Mac they are packed and read back by plain
arithmetic the engine writes into the shader, and the game's own picture is no longer copied into
a target holding such numbers, which a Mac refuses outright. On any machine, whatever the game
still draws in the pack's place, a mob the pack has no program for among it, is missing from the
targets its terrain and its water write rather than painted in flat, and the log says which. -
The pack is told what you are holding. A shader recognises an item by the number the pack
gives it in its own table, and nothing was looking your hands up in that table, so whatever you
carried the pack was told you carried nothing it knew. What that drives on most packs is the
light in your hand, which now follows the item the pack's table names. Both hands are read. The
block you are aiming at and the mount you are riding go through tables of the same kind and are
read with them. -
A pack that says it cannot be drawn without the translucent entity program now loads.
RenderPearl names that capability in its own file, the eng...
v0.10.0-beta
Added
-
Eight shadow colour buffers for a pack that asks for them. A pack declaring
HIGHER_SHADOWCOLORmay now draw the light intoshadowcolor0throughshadowcolor7and read
them back, which is what Iris gives it. Before, a shadow program naming anything above
shadowcolor1had 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 writingshadowcolor0alone
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
andSSBO. The storage buffers behind the second were already built and filled from a pack's
ownbufferObjectlines, 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.
shadowtex0HWand
shadowtex1HWare bound now, to the same two depth images asshadowtex0andshadowtex1,
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 withoutSEPARATE_HARDWARE_SAMPLERSwas
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 setting, or step through a portal. Nothing about the
picture changes. -
A pack loads its entities, sky, clouds, weather, particles and far terrain in one reading.
Each of those six families opened the pack again on the loading thread and worked out the same
plan and the same program tree for itself before reading its own files, which was most of the
archive walking a load did. They now share one reading, and the report of a pack that used to
hold the title screen and every Apply for a second or two is written from a background thread
instead. On Complementary Unbound the families take under a second of background work where
they took four. Nothing about the picture changes.
Fixed
-
A
#ifdecides like the compiler where one side of an&&or||cannot be worked out.
A condition such asX != 0 && 100 / X > 5withXat zero was left undecided, because the
right side was worked out whatever the left one said, and an undecided condition kept its
branch in. The right side is now skipped where the left one has already decided, as the
preprocessor does, so such a branch is left out exactly as the pack meant it to be. -
A pack whose conditionals are written loosely draws, as it draws under Iris. Reverie Beta
writes one#ifdefwith no name after it and one with two names joined by&&, and Photon
writes an#endifwith nothing open for it to close: none of the three is a directive GLSL will
take. Iris hands the compiler what its own preprocessor produced, so nothing of the sort reaches
a compiler there and both packs draw; here the lines went on to the compiler as the pack wrote
them, six of Reverie's programs and three of Photon's would not build, and one program that will
not build stops the whole pack with nothing of it drawn. The three shapes are now read the way
Iris reads them, a nameless one taking the branch it opens, a name followed by anything else
deciding on that name alone, and one with nothing to close being left out of the text, with the
file and the line said once in the log. A pack that writes its conditionals properly is
untouched. -
A value a pack spreads over several lines stops at the end of its own branch. A
shaders.propertiesvalue continued with a backslash was joined before the conditionals around
it were read, so a value whose last line carried a backslash too swallowed the#elseor
#endifthat closed its branch, and the conditional around it went dark with them. Photon
writes its moon brightness that way, one line per phase, and both sides of Moon Phase Affects
Brightness were wrong. Switched on, the table never parsed and the constant from the branch
meant to replace it was read instead, so the moon lit the ground the same on every night of the
cycle. Switched off, that constant sat inside the branch the swallowed#elsehad left open,
no brightness was declared at all, and the shaders read the missing one as zero: the moon gave
no light whatever, and every night away from a torch was as dark as a new moon. The moon now
dims through the cycle with the option on, and is a plain full moon every night with it off. -
A condition continued over several lines with a backslash is read whole. The pack's
conditionals decide which includes are followed, and one continued past its first line was
decided on that fragment alone, which stood for true. Photon undefines its waving switches
under one of those, so the include the switches guard was skipped and its terrain and shadow
programs compiled against a function that was not there. -
A pack that writes a constant through a macro is no longer refused whole for it. A
constwhose initialiser the Vulkan compiler would not take loses the keyword at load, and
whether it would was judged on the names written on the line: a macro's name passed whatever
it stood for, so a macro over a value this engine had already had to demote left a constant
the compiler then refused, and one pass refusing takes the whole pack down. The macro is now
read through. Photon writes its fog colours that way, and was refused at load on its blending
pass. -
Blend overrides, target sizes, flips and
endFlashShadowsfollow the pack's own settings.
Those four families ofshaders.propertieslines were read whether or not the#ifaround
them held, so a line the pack had switched off still applied. Photon's two low-resolution
cloud targets took the size of the last of its four choices whichever was picked, and
Complementary's water blend and its weather target'soffheld whatever the define or the
setting around them said. -
A pack switching off one of its own programs is obeyed for the world, not only for its
full-screen passes. A pack turns individual programs on and off from its settings, and the ones
that draw the world went on being drawn whatever the setting said. Where the pack offers a
plainer program behind the one it switched off, that plainer one now draws instead, which is what
the pack is asking for: Bliss draws its translucent entities and blocks through its ordinary
entity and block programs until you turn its translucent entities setting on. Where it offers
none, nothing is drawn: Bliss and BSL stop building a shadow map in the Nether, and Bliss in the
End as well, which is what both of them ask for there. -
A modded dimension is drawn from the folder its pack sends it to. Both Complementary
variants with Euphoria Patches list the worlds that belong to the Nether and to the End one
continued line per mod indimension.properties, and only the first of those lines was read.
Everything the rest name, which is Ad Astra's planets and orbits, Prominent's dimensions, The
Bumblezone and half a dozen more, fell through to the pack's catch-all: those worlds were drawn
with the overworld sky, the overworld fog and the overworld full-screen passes instead of the
ones the pack wrote for them. They now get the folder the pack names, as they do under Iris. -
A pack that says it cannot bear anisotropic filtering is believed. BSL and both
Complementary variants writebreaksAnisotropyin theirshaders.properties, and the line was
read nowhere: with Texture Filtering set to Anisotropic in Video Settings, their terrain showed
a strip of the neighbouring sprite along a block edge seen from low down, where the same packs
under Iris do not. Their terrain and their shadow map now read the block atlas without
anisotropy whatever the setting says, as Iris reads them. Everything the pack does not draw
keeps the player's value, and so does the number the pack itself reads for the setting. -
A pack is told what convention a resource pack draws its material maps in, as Iris tells it.
MC_TEXTURE_FORMAT_LAB_PBR, and the revision beside it, are what a pack written against them
branches its labPBR decode on, and neither was ever posed her...
v0.9.0-beta
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 MiBis the old hardcoded
ceiling and the default. Moving it applies at once, with no pack reload: lowering may drop
unused cached shaders. Written invitrail/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 filevitrail/box-shadow-cullin 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 filevitrail/driver-trigin 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 way. A pack that defines its own sine keeps it in both states.
Changed
-
Compute shaders now hit the compiled-module cache on a pack reload. They used to miss
every time because the disk key hashed the load number the debug name carries. That number
is out of the key. Computes are compiled by this engine, not by the game's shader compiler;
what is kept is the compiled module and its bind table, the same files graphics shaders
already write undervitrail/modules. Vulkan pipelines are built each load as before. -
F3 names the pack the way Iris does. The profile line is the scanned name or Custom, with
how many options sit outside it, and the shadow line is Sodium'sC: a/b D: dwithout this
engine's own cull dialect. -
The compiling overlay no longer covers F3. While the debug screen is open, "Compiling
shaders..." rides the Vitrail F3 line instead of the corner. Close F3 and the corner overlay
is as it was. -
Video-settings labels tell the truth about reload. Titles are shorter so they fit the
row. Each tooltip says whether the change applies at once, at the next frame, or reloads
the pack. -
Loading a pack a second time no longer compiles its shaders again. The compiled module
and the table of what it binds are kept under
vitrail/modulesin the game folder and read back when the same shader comes round again, so
a warm load does no compiling and no inspecting at all. Editing a shader or moving a pack
setting changes what is asked for, and so does updating the mod, the game or the loader, and
anything that has changed is built from scratch as before. Each release keeps its own folder
and takes the older ones away with it, the whole thing is capped, and the log says how many
shaders came off the disk, how many were built and how much is stored.It removes work rather than time. Measured on one machine: a warm load compiles none of
the two hundred odd shaders a cold one compiles, and the wait before the pack draws is the
same to the second. What a pack load really costs sits somewhere neither this nor the log
line is looking. -
Loading a pack again no longer rewrites its shaders from scratch. Turning a pack's GLSL
into the dialect this backend speaks is one of the three things a pack load pays for, and it
is the same answer every time the same pack comes back. What it came to is kept under
vitrail/translationsin the game folder and read back instead. Editing a shader, moving a
pack setting, changing the shadow map scale, updating the mod or the game, or switching one of
the mod's own measurement switches all change what is asked for, and anything that has changed
is rewritten as before. Each version keeps its own folder and takes the older ones away with
it, the whole thing is capped at a quarter of a gigabyte, and the log says how many programs
came off the disk and how many were rewritten. It removes work rather than time: the wait
before a pack draws is the same, and what changes is that none of it is spent here. -
A shadow lookup a pack asks the hardware to compare is now compared by the hardware. A
pack declaringsampler2DShadowused to have that comparison rebuilt in shader
arithmetic on every tap, a dozen instructions where a comparison sampler pays one, and a
shadow's blur loop makes many taps per pixel. The comparison now rides the sampler, the pair
Iris binds when a pack asks for its hardware shadow filtering, which every pack that declares
the type does; the picture it computes is the same blend of the same four texels. For a
machine where the sampler road is suspected of a wrong image, a file
vitrail/soft-shadow-comparein the game directory, or-Dvitrail.softShadowCompare=true,
puts the arithmetic back in one launch, and removing it again takes a pack reload. -
A patch of this mod that stops fitting the game now refuses to start it, instead of drawing a
wrong picture. Those patches used to be dropped without a word when a game or Sodium update
moved what they attach to, and what reached the screen was an effect quietly missing or a
surface lit by the wrong program, with nothing in the log pointing at it. The failure now names
itself at launch. The one exception is the line this mod adds to the F3 overlay, which is
allowed to go missing because nothing on screen depends on it. -
A texture's chain of shrunken copies is rebuilt only when its base has changed. Packs that
blur or expose through those copies asked for the whole chain to be rebuilt before every pass
that reads one, even when nothing had touched the image in between; two readers in a row now
pay one rebuild instead of two. The copies read are the same ones. Not measured, so this says
work removed and not frames gained. -
Two pieces of per-frame work on the graphics card are gone, and the picture is the same.
The far terrain's own depth image is emptied by the pass that draws into it rather than by a
command of its own, which also spares the full stop of the card that such a command carries.
The voxel volumes that follow the camera now copy only the part of themselves that survives
the move, where they used to copy the whole volume. Neither has been measured, so this says
work removed and not frames gained. -
A handful of values handed to shaders are worked out once a frame instead of once for
every program that asks for them. Where the sun and the moon are, which way is up, the
End's flash, and the two matrices a pack multiplies its vertices by were all rebuilt from
scratch each time a shader asked, which for a large pack is dozens of times a frame out of
numbers that had not moved in between. They are kept and reused until something they are
built from actually changes. The values handed over are the same ones, to the bit, and this
has not been measured either, so again it is work removed rather than frames gained. -
The same picture with less repeated work inside the frame. A pack's geometry program
re-bound every texture it declares for every chunk region, mob piece and particle batch it
drew, where only the two to four that follow the image in hand can change inside one pass;
the rest are now written once, when the pass opens. Beside it: the far terrain's sections are
collected into a list sized from the count Distant Horizons gives rather than grown into one,
and handed on without a copy; a vertex format is searched for this engine's own elements only
until the first one it has not got; and a pass is asked for its name only once everything
cheaper about it has already matched. Whether the frame rate moves is a machine's to measure.
Fixed
- AstraLex night skies are round again. A pack that interpolates a 3x3 matrix between
vertex and fragment, AstraLex's planet among them, was stretched into an oval: this backend
numbers varyings by count, and a matrix occupies several slots. Ea...
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.