From fa7082817ebb8cb1c9ebd979226975226c6788a0 Mon Sep 17 00:00:00 2001 From: MelekTaus Moribundus Date: Thu, 25 Jun 2026 07:11:27 +0200 Subject: [PATCH] Fix frozen rim pixels via GPU coverage stamp; add brush masks Replace the CPU island-mask dilation guard on the GPU backend with a coverage pass rendered through the same brush rasterizer, so sub-pixel rim texels that the GPU brush can never reach fall into the gutter and stay paintable (no more frozen loaded pixels at island edges). Also includes user content: additional brush masks (dirt) with an expanded mask selector in the HUD prefab, and CharacterController / wall-climb inspector tuning. Co-Authored-By: Claude Opus 4.8 --- Assets/Brushes/BrushesHard.png.meta | 2 +- Assets/Brushes/BrushesSoft.png.meta | 2 +- Assets/Brushes/dirt_01.png | Bin 0 -> 46644 bytes Assets/Brushes/dirt_01.png.meta | 117 ++++ Assets/Prefabs/PaintHudPanel.prefab | 792 ++++++++++++++++++++++++++- Assets/Scenes/SampleScene.unity | 12 +- Assets/Scripts/MeshPainter.Gpu.cs | 41 +- Assets/Shaders/MeshPaintBrush.shader | 36 ++ 8 files changed, 986 insertions(+), 16 deletions(-) create mode 100644 Assets/Brushes/dirt_01.png create mode 100644 Assets/Brushes/dirt_01.png.meta diff --git a/Assets/Brushes/BrushesHard.png.meta b/Assets/Brushes/BrushesHard.png.meta index 5cc034e..7996126 100644 --- a/Assets/Brushes/BrushesHard.png.meta +++ b/Assets/Brushes/BrushesHard.png.meta @@ -69,7 +69,7 @@ TextureImporter: platformSettings: - serializedVersion: 4 buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 + maxTextureSize: 512 resizeAlgorithm: 0 textureFormat: -1 textureCompression: 0 diff --git a/Assets/Brushes/BrushesSoft.png.meta b/Assets/Brushes/BrushesSoft.png.meta index 307e6be..2a77981 100644 --- a/Assets/Brushes/BrushesSoft.png.meta +++ b/Assets/Brushes/BrushesSoft.png.meta @@ -69,7 +69,7 @@ TextureImporter: platformSettings: - serializedVersion: 4 buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 + maxTextureSize: 512 resizeAlgorithm: 0 textureFormat: -1 textureCompression: 0 diff --git a/Assets/Brushes/dirt_01.png b/Assets/Brushes/dirt_01.png new file mode 100644 index 0000000000000000000000000000000000000000..5403e9f355870920d3a5b4c0077d05fe91dba64d GIT binary patch literal 46644 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 z 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 e|6s7a work layout - // (R=metallic, G=smoothness, B=occlusion); UploadColorsToRT fills A = island coverage. + // (R=metallic, G=smoothness, B=occlusion). Alpha = coverage, stamped below. var work = new Color32[src.Length]; for (int i = 0; i < src.Length; i++) work[i] = new Color32(src[i].r, src[i].a, src[i].g, 0); UploadColorsToRT(work, gm.display, linear: true); + StampCoverage(gm.display); PackMs(gm); // build the final mask RT once so the material shows the seeded values } else { UploadColorsToRT((Color32[])src.Clone(), gm.display, linear: gm.sRGB == false); + StampCoverage(gm.display); } } + /// + /// Stamps the dilation coverage guard into a map's alpha: rasterizes the mesh with the brush + /// shader's coverage pass (pass 1), writing alpha = 1 on exactly the texels the GPU brush can + /// paint. This replaces the CPU island-mask approximation, whose generous edge tolerance marked + /// sub-pixel island borders as protected even though the brush never reaches them - so they + /// could never be overpainted (stayed frozen at their seeded value) while the dilation guarded + /// them. With a GPU-accurate guard those border texels fall in the gutter (alpha 0) and dilation + /// overpaints them normally. Texels stay alpha 0 until reached, identical to the brush. + /// + private void StampCoverage(RenderTexture rt) + { + if (!_brushMat || !_bakedMesh) return; + var prev = RenderTexture.active; + Graphics.SetRenderTarget(rt); + if (_brushMat.SetPass(1)) + { + int sub = _bakedMesh.subMeshCount; + for (int i = 0; i < sub; i++) Graphics.DrawMeshNow(_bakedMesh, Matrix4x4.identity, i); + } + else + { + Debug.LogError("[MeshPainter] Brush coverage pass (pass 1) missing - dilation guard not seeded.", this); + } + RenderTexture.active = prev; + } + private void TeardownGpu() { if (_gpu != null) @@ -124,16 +152,13 @@ public partial class MeshPainter return rt; } - /// Writes Color32 data into a RenderTexture via a temporary texture. + /// Writes Color32 RGB into a RenderTexture via a temporary texture. Alpha (the + /// dilation coverage marker) is cleared to 0 here and stamped afterwards by StampCoverage, + /// so the guard matches the GPU rasterizer exactly (see SeedGpuMap). private void UploadColorsToRT(Color32[] colors, RenderTexture rt, bool linear) { var tmp = new Texture2D(textureSize, textureSize, TextureFormat.RGBA32, false, linear); - // Alpha is the dilation coverage marker: island texels (real content) = 255 so the - // dilate pass keeps them; the gutter = 0 so it stays paddable. Driving this from the UV - // islands (not a flat "unpainted") protects seeded content from the first stroke's bleed. - var island = GetIslandMask(); - bool useMask = island.Length == colors.Length; - for (int i = 0; i < colors.Length; i++) colors[i].a = (useMask && island[i]) ? (byte)255 : (byte)0; + for (int i = 0; i < colors.Length; i++) colors[i].a = 0; tmp.SetPixels32(colors); tmp.Apply(false); diff --git a/Assets/Shaders/MeshPaintBrush.shader b/Assets/Shaders/MeshPaintBrush.shader index a7ff0f0..348f379 100644 --- a/Assets/Shaders/MeshPaintBrush.shader +++ b/Assets/Shaders/MeshPaintBrush.shader @@ -103,6 +103,42 @@ Shader "Hidden/MeshPaintBrush" } ENDCG } + + // Pass 1 - coverage: rasterizes the mesh in UV space (identical vertex transform to + // the brush) and writes alpha = 1 on exactly the texels the brush can paint. Used to + // seed the dilation guard (display RT alpha) so it matches the GPU rasterizer instead + // of a CPU point-in-triangle approximation. Texels the brush can never reach (sub-pixel + // island borders) stay alpha = 0 -> the gutter, so dilation can still overpaint them. + Pass + { + ZTest Always + ZWrite Off + Cull Off + Blend Off + ColorMask A + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; + struct v2f { float4 pos : SV_POSITION; }; + + v2f vert (appdata v) + { + v2f o; + float2 p = v.uv * 2.0 - 1.0; + #if UNITY_UV_STARTS_AT_TOP + p.y = -p.y; + #endif + o.pos = float4(p, 0.0, 1.0); + return o; + } + + fixed4 frag (v2f i) : SV_Target { return fixed4(0, 0, 0, 1); } + ENDCG + } } Fallback Off }