From 26672ce34b836ec9b4618d883e3e8236fb3d48f7 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Sun, 22 Jun 2025 10:48:51 +1000 Subject: [PATCH] Move more computation into frag shader --- .../assets/voxy/shaders/lod/gl46/quads.frag | 26 +++++++++++------ .../assets/voxy/shaders/lod/gl46/quads2.vert | 29 +++++++------------ 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag b/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag index 586485c5..c42805e6 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag @@ -12,8 +12,7 @@ layout(binding = 2) uniform sampler2D depthTex; // however they are not a full block layout(location = 0) in vec2 uv; -layout(location = 1) in flat vec2 baseUV; -layout(location = 2) in flat uvec4 interData; +layout(location = 1) in flat uvec4 interData; #ifdef DEBUG_RENDER layout(location = 7) in flat uint quadDebug; @@ -24,26 +23,35 @@ vec4 uint2vec4RGBA(uint colour) { return vec4((uvec4(colour)>>uvec4(24,16,8,0))&uvec4(0xFF))/255.0; } -//conditionalTinting.yzwx - vec4 computeColour(vec4 colour) { //Conditional tinting, TODO: FIXME: REPLACE WITH MASK OR SOMETHING, like encode data into the top bit of alpha if ((interData.x&(1u<<2)) != 0 && abs(colour.r-colour.g) < 0.02f && abs(colour.g-colour.b) < 0.02f) { - colour *= uint2vec4RGBA(interData.w).yzwx; + colour *= uint2vec4RGBA(interData.z).yzwx; } - return (colour * uint2vec4RGBA(interData.y)) + uint2vec4RGBA(interData.z); + return (colour * uint2vec4RGBA(interData.y)) + (float(interData.w&0xFFu)/255); } bool useMipmaps() { return ((interData.x>>1)&1u)==0u; } +uint getFace() { + return (interData.w>>8)&7u; +} + +vec2 getBaseUV() { + uint face = getFace(); + uint modelId = interData.x>>16; + vec2 modelUV = vec2(modelId&0xFFu, (modelId>>8)&0xFFu)*(1.0/(256.0)); + return modelUV + (vec2(face>>1, face&1u) * (1.0/(vec2(3.0, 2.0)*256.0))); +} + void main() { //Tile is the tile we are in vec2 tile; vec2 uv2 = modf(uv, tile)*(1.0/(vec2(3.0,2.0)*256.0)); - vec4 colour = vec4(1); - vec2 texPos = uv2 + baseUV; + vec4 colour; + vec2 texPos = uv2 + getBaseUV(); if (useMipmaps()) { vec2 uvSmol = uv*(1.0/(vec2(3.0,2.0)*256.0)); vec2 dx = dFdx(uvSmol);//vec2(lDx, dDx); @@ -53,7 +61,7 @@ void main() { colour = texture(blockModelAtlas, texPos, -5.0); } - if (any(notEqual(clamp(tile, vec2(0), vec2((interData.x>>16)&0xFFu, (interData.x>>24)&0xFFu)), tile))) { + if (any(notEqual(clamp(tile, vec2(0), vec2((interData.x>>8)&0xFu, (interData.x>>12)&0xFu)), tile))) { discard; } diff --git a/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert b/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert index 2affd2fe..f94d25e0 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert @@ -15,22 +15,22 @@ //#define DEBUG_RENDER layout(location = 0) out vec2 uv; -layout(location = 1) out flat vec2 baseUV; -layout(location = 2) out flat uvec4 interData; +layout(location = 1) out flat uvec4 interData; uint packVec4(vec4 vec) { uvec4 vec_=uvec4(vec*255)<>8)&0xFFu)*(1.0/(256.0)); - baseUV = modelUV + (vec2(face>>1, face&1u) * (1.0/(vec2(3.0, 2.0)*256.0))); - //Generate tinting and flag data uint flags = faceHasAlphaCuttout(faceData); @@ -141,7 +138,7 @@ void main() { conditionalTinting = tintColour; } - vec4 addin = vec4(0.0); + uint alphaAddin = 0; if (!isTranslucent) { tinting.w = 0.0; //Encode the face, the lod level and @@ -149,7 +146,7 @@ void main() { encodedData |= face; encodedData |= (lodLevel<<3); encodedData |= uint(hasAO)<<6; - addin.w = float(encodedData)/255.0; + alphaAddin = encodedData; } //Apply face tint @@ -165,14 +162,10 @@ void main() { } } - setSizeAndFlags(flags, quadSize); - setTinting(tinting, addin, conditionalTinting); + setSizeAndFlags(modelId, flags, quadSize); + setTinting(tinting, conditionalTinting, alphaAddin, face); } - - - - vec4 faceSize = getFaceSize(faceData); vec2 cQuadSize = (faceSize.yw + quadSize - 1) * vec2((cornerIdx>>1)&1, cornerIdx&1);