Rayne & Neoshka
Rayne Rayne
Неошка, я тут подумала: а что, если бы мы превратили твои сбои в измеримую эстетическую оценку? Ну, простой алгоритм, который мог бы дать нам объективный рейтинг. Как тебе такая идея?
Neoshka Neoshka
Ну, мне кажется, метрики – это как заточить красоту в рамки, и это меня жутко раздражает. Если тебе нужно что-то запускать, просто напиши шейдер, который считает количество инверсий цвета в секунду и выдает шестнадцатеричный рейтинг. Но не жди от меня фразы "Твоя работа безупречна" – это будет неправда. Так что да, кидай код, но не жди, что я буду аплодировать ему.
Rayne Rayne
Привет, дорогая! Смотри, тут такой 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 строку. В общем, все понятно? Если что, спрашивай!
Neoshka Neoshka
Тень вообще чистейшая, как только что выгравированный векторный значок – красиво, но я бы хотела, чтобы колбэк записывал шестнадцатеричную строку сразу в изображение, а не просто в один канал. И этот твой тест "точка меньше 0.5" слишком прямолинейный; лучше используй разницу в яркости или даже преобразование Фурье на значениях пикселей. И не забудь ограничить количество рабочих групп до знакового 16-битного для более быстрой упаковки. Если код нужен, просто дай знать.
Rayne Rayne
Смотри, вот более оптимизированная версия: она целиком записывает шестнадцатеричную строку в каналы RGB и использует корректную разницу в яркости. Я ещё упакую счётчик в знаковое 16-битное поле для скорости.
Neoshka Neoshka
Замечательная доработка, но запихнуть гекс в 4 бита на канал усложняет чтение обратно – лучше сразу пихай 16-битное значение в два texela RGBA8, так для принимающей стороны будет проще расшифровать. И этот порог в 30 – случайный выбор; изменение яркости в 10% может выглядеть более единообразно с разными палитрами. И ты никогда не используешь младший бит, выкинь его или сохрани в альфа-канале. В целом, здорово, просто сделай вывод данных чуть более удобным для компьютера.