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 98ef42da..afb4d58d 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/quads.frag @@ -1,4 +1,8 @@ #version 460 core +//Use quad shuffling to compute fragment mip +//#extension GL_KHR_shader_subgroup_quad: enable + + layout(binding = 0) uniform sampler2D blockModelAtlas; layout(binding = 2) uniform sampler2D depthTex; @@ -13,22 +17,50 @@ layout(location = 2) in flat vec4 tinting; layout(location = 3) in flat vec4 addin; layout(location = 4) in flat uint flags; layout(location = 5) in flat vec4 conditionalTinting; - +layout(location = 6) in flat vec2 quadSize; #ifdef DEBUG_RENDER -layout(location = 6) in flat uint quadDebug; +layout(location = 7) in flat uint quadDebug; #endif layout(location = 0) out vec4 outColour; + +vec4 computeColour(vec4 colour) { + //Conditional tinting, TODO: FIXME: REPLACE WITH MASK OR SOMETHING, like encode data into the top bit of alpha + if ((flags&(1u<<2)) != 0 && abs(colour.r-colour.g) < 0.02f && abs(colour.g-colour.b) < 0.02f) { + colour *= conditionalTinting; + } + return (colour * tinting) + addin; +} + +bool useMipmaps() { + return ((flags>>1)&1u)==0u; +} + 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; + if (useMipmaps()) { + vec2 uvSmol = uv*(1.0/(vec2(3.0,2.0)*256.0)); + vec2 dx = dFdx(uvSmol);//vec2(lDx, dDx); + vec2 dy = dFdy(uvSmol);//vec2(lDy, dDy); + colour = textureGrad(blockModelAtlas, texPos, dx, dy); + } else { + colour = texture(blockModelAtlas, texPos, -5.0); + } + + if (any(notEqual(clamp(tile, vec2(0), quadSize), tile))) { + discard; + } + //Check the minimum bounding texture and ensure we are greater than it if (gl_FragCoord.z < texelFetch(depthTex, ivec2(gl_FragCoord.xy), 0).r) { discard; } - vec2 uv = mod(uv, vec2(1.0))*(1.0/(vec2(3.0,2.0)*256.0)); - vec2 texPos = uv + baseUV; - //vec4 colour = solidColour; - //TODO: FIXME, need to manually compute the mip colour - vec4 colour = texture(blockModelAtlas, texPos, ((flags>>1)&1u)*-5.0);//TODO: FIXME mipping needs to be fixed so that it doesnt go cross model bounds + + //Also, small quad is really fking over the mipping level somehow if ((flags&1u) == 1 && (texture(blockModelAtlas, texPos, -16.0).a <= 0.1f)) { //This is stupidly stupidly bad for divergence @@ -38,14 +70,7 @@ void main() { #endif } - //Conditional tinting, TODO: FIXME: REPLACE WITH MASK OR SOMETHING, like encode data into the top bit of alpha - if ((flags&(1u<<2)) != 0 && abs(colour.r-colour.g) < 0.02f && abs(colour.g-colour.b) < 0.02f) { - colour *= conditionalTinting; - } - - outColour = (colour * tinting) + addin; - - //outColour = vec4(uv + baseUV, 0, 1); + outColour = computeColour(colour); #ifdef DEBUG_RENDER @@ -56,4 +81,30 @@ void main() { hash = hash * 1827364925 + 123325621; outColour = vec4(float(hash&15u)/15, float((hash>>4)&15u)/15, float((hash>>8)&15u)/15, 1); #endif -} \ No newline at end of file +} + + + +//#ifdef GL_KHR_shader_subgroup_quad +/* +uint hash = (uint(tile.x)*(1<<16))^uint(tile.y); +uint horiz = subgroupQuadSwapHorizontal(hash); +bool sameTile = horiz==hash; +uint sv = mix(uint(-1), hash, sameTile); +uint vert = subgroupQuadSwapVertical(sv); +sameTile = sameTile&&vert==hash; +mipBias = sameTile?0:-5.0; +*/ +/* +vec2 uvSmol = uv*(1.0/(vec2(3.0,2.0)*256.0)); +float lDx = subgroupQuadSwapHorizontal(uvSmol.x)-uvSmol.x; +float lDy = subgroupQuadSwapVertical(uvSmol.y)-uvSmol.y; +float dDx = subgroupQuadSwapDiagonal(lDx); +float dDy = subgroupQuadSwapDiagonal(lDy); +vec2 dx = vec2(lDx, dDx); +vec2 dy = vec2(lDy, dDy); +colour = textureGrad(blockModelAtlas, texPos, dx, dy); +*/ +//#else +//colour = texture(blockModelAtlas, texPos); +//#endif \ No newline at end of file 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 518da095..1efe7ed2 100644 --- a/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert +++ b/src/main/resources/assets/voxy/shaders/lod/gl46/quads2.vert @@ -20,9 +20,10 @@ layout(location = 2) out flat vec4 tinting; layout(location = 3) out flat vec4 addin; layout(location = 4) out flat uint flags; layout(location = 5) out flat vec4 conditionalTinting; +layout(location = 6) out flat vec2 size; #ifdef DEBUG_RENDER -layout(location = 6) out flat uint quadDebug; +layout(location = 7) out flat uint quadDebug; #endif /* @@ -41,17 +42,17 @@ vec4 uint2vec4RGBA(uint colour) { } vec4 getFaceSize(uint faceData) { - float EPSILON = 0.0005f; + float EPSILON = 0.00005f; vec4 faceOffsetsSizes = extractFaceSizes(faceData); + //Make the end relative to the start + faceOffsetsSizes.yw -= faceOffsetsSizes.xz; + //Expand the quads by a very small amount faceOffsetsSizes.xz -= vec2(EPSILON); faceOffsetsSizes.yw += vec2(EPSILON); - //Make the end relative to the start - faceOffsetsSizes.yw -= faceOffsetsSizes.xz; - return faceOffsetsSizes; } @@ -105,10 +106,10 @@ void main() { ivec2 quadSize = extractSize(quad); - - if (cornerIdx == 1) //Only if we are the provoking vertex { + size = vec2(quadSize-1); + vec2 modelUV = vec2(modelId&0xFFu, (modelId>>8)&0xFFu)*(1.0/(256.0)); baseUV = modelUV + (vec2(face>>1, face&1u) * (1.0/(vec2(3.0, 2.0)*256.0)));