StackBlitzed & TextureTide
StackBlitzed StackBlitzed
Привет, столкнулся с какой-то странной мерцающей артефактной фигней на спрайтовой текстуре в 2D — проявляется только при увеличении. Похоже на причуду драйвера, но, может, твои пиксельные правки помогут её заметить. Есть какие-нибудь приемы для выявления таких скрытых дефектов?
TextureTide TextureTide
Открой спрайт в редакторе, отключи все фильтры, мипмапы и сжатие, увеличь изображение до соотношения 1:1 – каждый пиксель в один пиксель. Проверь значения RGBA каждого пикселя – сбой драйвера обычно проявляется как еле заметное цветовое "залитие" или несовпадение каналов. Сначала отключи мипмапы; плохой LOD может просачиваться на следующий уровень и выглядеть как мерцание. Если проблема все равно видна, перекрась пиксель вручную – если мерцание исчезнет, это проблема текстуры, а не ошибка GPU. Экспортируй как плоский PNG RGBA8, перезагрузи и сравни – это исключит артефакты сжатия. И просто ради интереса, добавь намеренно неправильный пиксель где-нибудь и посмотри, заметишь ли ты его – так тренируется глаз, чтобы замечать скрытые дефекты.
StackBlitzed StackBlitzed
Отличный чек-лист, кстати. Этот фокус с пикселями один в один – вообще классика. Обычно я добавляю слой шума в Фотошопе, чтобы глаз заставляли "гулять", а потом сравниваю с оригиналом. Кстати, а ты смотрела, как Chromium обрабатывает LOD-ы в своей системе текстур? Там просто кладезь, если охотишься за тонкими, едва заметными артефактами.
TextureTide TextureTide
В общем, разбираться с логикой LOD в Chromium – это как лук чистить, слой за слоем. Каждый уровень мип-карты – отдельная вселенная цветов. Я вытащила шейдерный кэш и выяснила, что иногда он слишком сильно обрезает самый маленький мип, из-за этого и это слабое свечение, которое ты ищешь. Попробуй заставить пайплайн генерировать все мип-карты явно в тестовой текстуре, а потом смотри логи GPU, чтобы понять, где начинается расхождение. Быстрый способ: создай маленький шахматный узор, дай Chromium самому сделать мип-карты, а потом выгрузи цепочку в просмотрщик и просто посмотри на каждый уровень. Так сразу видно, где это мерцание проникает, и тогда можно подкрутить LOD bias, чтобы его убрать. И если хочешь доказать свою правоту, вставь пиксель намеренно другого цвета в слой с высоким разрешением и посмотри, сохранит ли рендерер его нетронутым – отличный эксперимент по визуальному саботажу.
StackBlitzed StackBlitzed
Отлично, братан. Сейчас подкину фиктивную текстуру и выдам LOD, посмотрим, где начнётся утечка. Если Chromium будет прижимать самый нижний уровень, я подкручу смещение, пока не станет всё чисто. Следи за тем пикселем-беглецом, про который ты говорила – хороший способ проверить, как работает конвейер. Нужен скрипт для автоматической выдачи? У меня есть один, который выводит гистограмму для каждого мипа, просто скажи.
TextureTide TextureTide
Конечно, вот небольшой скрипт, который можно использовать в shell, чтобы извлечь каждый уровень MIP и вывести простой гистограмму для каждого слоя, используя ImageMagick’s mogrify. Просто укажи путь к текстуре, и он выдаст данные: ```bash #!/usr/bin/env bash # dump_mips.sh – принимает файл текстуры, выводит гистограмму для каждого уровня texfile="$1" mkdir -p mips # извлекаем каждый уровень convert "$texfile" -define png:compression-level=0 mips/level_%d.png # перебираем уровни for img in mips/*.png; do level=${img##*_} level=${level%.*} echo "Уровень $level:" convert "$img" -format "%c" histogram:info: | sort -nr | head -n 10 echo done ``` Сделай его исполняемым (`chmod +x dump_mips.sh`) и запусти `./dump_mips.sh your_texture.png`. Он извлечет каждый уровень MIP в папку `mips/` и покажет десять самых часто встречающихся цветов для каждого уровня, чтобы ты мог заметить любые странные переходы. Если ты на Windows, замени `convert` на `magick` и подкорректируй shebang. Удачи!
StackBlitzed StackBlitzed
Отличный скрипт, спасибо. Сейчас подкину пару тестовых текстур, запущу, потом посмотрю основные цвета для каждого уровня. Если первые несколько мипов будут некорректные, подкручу LOD bias, чтобы избавиться от артефактов. И если хочешь пропустить сжатие, просто убери флаг `-define png:compression-level=0` — тогда будет сжатие без потерь. Сообщи, что увидишь.