Skip to content

Releases: avpbynf/vitrail-shaders

v0.13.0-beta

v0.13.0-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Oct 17:24

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 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 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

v0.12.0-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Sep 17:50

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 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
    reading vaPosition or vaUV0 in 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 #define or #undef written 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.passTimings set, 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

v0.11.0-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Sep 10:37

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_BLENDING is 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 final program 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 in colortex0 is 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 name texture inside 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...

Read more

v0.10.0-beta

v0.10.0-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Sep 08:52

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 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 #if decides like the compiler where one side of an && or || cannot be worked out.
    A condition such as X != 0 && 100 / X > 5 with X at 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 #ifdef with no name after it and one with two names joined by &&, and Photon
    writes an #endif with 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.properties value 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 #else or
    #endif that 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 #else had 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
    const whose 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 endFlashShadows follow the pack's own settings.
    Those four families of shaders.properties lines were read whether or not the #if around
    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's off held 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 in dimension.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 write breaksAnisotropy in their shaders.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...

Read more

v0.9.0-beta

v0.9.0-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 01 Sep 05:40

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 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 under vitrail/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's C: a/b D: d without 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/modules in 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/translations in 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 declaring sampler2DShadow used 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-compare in 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...
Read more

v0.8.1-beta

v0.8.1-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Aug 20:13

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

v0.8.0-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 26 Aug 09:46

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 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.noise or a dimension.properties line written under a setting's #if now 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=false gets 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 a screen= 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-compiles in 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 dropped writeonly, readonly, restrict and
    coherent on the way, whichever side of uniform the 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...

Read more

v0.7.5-beta

v0.7.5-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Aug 03:06

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=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.

v0.7.4-beta

v0.7.4-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Aug 06:13

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

v0.7.3-beta Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Aug 03:49

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.