From faa36dd679ee8eb03b6f3ebf63bd9ccc8aa2ac50 Mon Sep 17 00:00:00 2001 From: Asuro Date: Sun, 1 Jun 2025 02:06:32 +0200 Subject: [PATCH] fix dithergen --- src/game/rendering/Dither.cpp | 14 +++++++++----- src/game/rendering/Rendering.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/game/rendering/Dither.cpp b/src/game/rendering/Dither.cpp index 3e4f240..c710c0a 100644 --- a/src/game/rendering/Dither.cpp +++ b/src/game/rendering/Dither.cpp @@ -16,11 +16,12 @@ void DitherGen(DitherData& data, int32_t recursion) for (int32_t i = 0; i < data.BrightnessBucketCount; ++i) data.BrightnessBuckets[i] = 0; - for (int32_t recursionLevel = 0; recursionLevel < recursion; ++recursionLevel) + // add "subdivided" beyer matrix layers + for (int32_t recursionLevel = 0; recursionLevel < recursion - 1; ++recursionLevel) { int32_t startCount = data.PointCount; float offset = bx::pow(0.5f, recursionLevel + 1); - for (int32_t i = 0; i < 4; ++i) + for (int32_t i = 1; i < 4; ++i) { for (int32_t j = 0; j < startCount; ++j) { @@ -30,6 +31,7 @@ void DitherGen(DitherData& data, int32_t recursion) } } + // Texture info setup uint64_t dotsPerSide = bx::round(bx::pow(2, recursion)); data.DitherTexDepth = dotsPerSide * dotsPerSide; data.DitherTexWH = 16 * dotsPerSide; @@ -41,6 +43,7 @@ void DitherGen(DitherData& data, int32_t recursion) return; } + // What does this do? float invRes = 1.0f / data.DitherTexWH; for (int32_t z = 0; z < data.DitherTexDepth; ++z) { @@ -48,7 +51,7 @@ void DitherGen(DitherData& data, int32_t recursion) float dotArea = 0.5f / dotCount; float dotRadius = bx::sqrt(dotArea / bx::kPi); - int zOffset = z * data.DitherTexWH * data.DitherTexWH; + int32_t zOffset = z * data.DitherTexWH * data.DitherTexWH; for (int32_t y = 0; y < data.DitherTexWH; ++y) { int32_t yOffset = y * data.DitherTexWH; @@ -59,7 +62,9 @@ void DitherGen(DitherData& data, int32_t recursion) for (int32_t i = 0; i < dotCount; ++i) { Vec2 vec = point - data.Points[i]; - Vec2 wrappedVec{bx::mod(vec.x + 0.5f, 1.0f) - 0.5f, bx::mod(vec.y + 0.5f, 1.0f) - 0.5f}; + float wrapX = bx::wrap(vec.x + 0.5f, 1.0f) - 0.5f; + float wrapY = bx::wrap(vec.y + 0.5f, 1.0f) - 0.5f; + Vec2 wrappedVec = {wrapX, wrapY}; float curDist = Magnitude(wrappedVec); dist = bx::min(dist, curDist); } @@ -67,7 +72,6 @@ void DitherGen(DitherData& data, int32_t recursion) dist = dist / (dotRadius * 2.4f); float val = bx::clamp(1.0f - dist, 0.0f, 1.0f); data.DitherTex[x + yOffset + zOffset] = Vec4{val, val, val, 1.0f}; - // data.DitherTex[x + yOffset + zOffset] = Vec4{1.0, 0.0f, 0.0f, 1.0f}; int32_t bucket = bx::clamp( uint32_t(val * DitherData::BrightnessBucketCount), 0, DitherData::BrightnessBucketCount - 1); data.BrightnessBuckets[bucket] += 1; diff --git a/src/game/rendering/Rendering.h b/src/game/rendering/Rendering.h index 2f8432e..3ed3d87 100644 --- a/src/game/rendering/Rendering.h +++ b/src/game/rendering/Rendering.h @@ -103,7 +103,7 @@ namespace Game uint32_t ResetFlags = BGFX_RESET_VSYNC; uint16_t MainViewID = 10; float LastShaderLoadTime = 0.0f; - int32_t DitherRecursion = 1; + int32_t DitherRecursion = 3; public: void Setup(const RenderingSetup& setup);