Rayne & Neoshka
Неошка, я тут подумала: а что, если бы мы превратили твои сбои в измеримую эстетическую оценку? Ну, простой алгоритм, который мог бы дать нам объективный рейтинг. Как тебе такая идея?
Ну, мне кажется, метрики – это как заточить красоту в рамки, и это меня жутко раздражает. Если тебе нужно что-то запускать, просто напиши шейдер, который считает количество инверсий цвета в секунду и выдает шестнадцатеричный рейтинг. Но не жди от меня фразы "Твоя работа безупречна" – это будет неправда. Так что да, кидай код, но не жди, что я буду аплодировать ему.
Привет, дорогая!
Смотри, тут такой GLSL compute shader. Он считает, сколько раз цвета меняются в секунду.
Вкратце:
* Входное изображение привязано к binding 0.
* Выходное изображение (с hex score в формате RGBA) - к binding 1.
* Размер workgroup - 16x16 пикселей.
Каждая итерация обрабатывает один пиксель. Сравнивает текущий пиксель с соседями справа и снизу. Если сравнение проходит (простой тест на инверсию), увеличивает счетчик.
В конце, один пиксель в каждой workgroup записывает общее количество инверсий (ограничено 255) в виде значения в красном канале выходного изображения.
Чтобы использовать:
1. Привяжи входную текстуру к binding 0.
2. Создай выходную текстуру высотой 2 пикселя, по одному пикселю на workgroup, и привяжи ее к binding 1.
3. Запусти compute shader командой `glDispatchCompute((width+15)/16, (height+15)/16, 1);`.
4. Прочитай красный канал каждого пикселя выходной текстуры, чтобы получить score в диапазоне [0,255]. Далее, в основном коде можешь отформатировать его в hex строку.
В общем, все понятно? Если что, спрашивай!
Тень вообще чистейшая, как только что выгравированный векторный значок – красиво, но я бы хотела, чтобы колбэк записывал шестнадцатеричную строку сразу в изображение, а не просто в один канал. И этот твой тест "точка меньше 0.5" слишком прямолинейный; лучше используй разницу в яркости или даже преобразование Фурье на значениях пикселей. И не забудь ограничить количество рабочих групп до знакового 16-битного для более быстрой упаковки. Если код нужен, просто дай знать.
Смотри, вот более оптимизированная версия: она целиком записывает шестнадцатеричную строку в каналы RGB и использует корректную разницу в яркости. Я ещё упакую счётчик в знаковое 16-битное поле для скорости.
Замечательная доработка, но запихнуть гекс в 4 бита на канал усложняет чтение обратно – лучше сразу пихай 16-битное значение в два texela RGBA8, так для принимающей стороны будет проще расшифровать. И этот порог в 30 – случайный выбор; изменение яркости в 10% может выглядеть более единообразно с разными палитрами. И ты никогда не используешь младший бит, выкинь его или сохрани в альфа-канале. В целом, здорово, просто сделай вывод данных чуть более удобным для компьютера.