- Сообщения
- 27
- Счётчик реакций
- 34
- Очки
- 740
Коллеги, приветствую всех, кто бьётся над тем, чтобы впихнуть в знакомые нам 256x192 и два цвета в знакомые 8x8 больше, чем кажется возможным.
Хочу поднять, возможно, философский, но очень практический вопрос, который возникает при отрисовке плавных линий, кривых и диагоналей. Речь о сглаживании (антиалиасинге).
На современных системах это решается на уровне железа или сложных шейдеров. Нашем же случае — это чистой воды искусство обмана зрения в условиях жесточайших ограничений (2 цвета в атрибуте, жёсткая сетка знакомест).
Давайте разберем тему по косточкам:
1. Классические приёмы и «спектрум-джиттер». Самый известный метод — использование двух соседних атрибутов для создания третьего, промежуточного цвета за счёт мерцания (dithering). Но это работает только в статике или очень медленной анимации. Какие ещё классические алгоритмы (например, упрощённый алгоритм Ву для линии) реально применимы на Z80? Есть ли у кого готовая, вылизанная подпрограмма рисования сглаженной линии?
2. Цвет vs. Яркость. Из-за особенностей атрибутов, иногда эффективнее сглаживать не переход между цветами (ink/paper), а между яркостями (BRIGHT). Была ли у вас практика, когда сглаженная серая шкала из чёрного, темно-серого (черный+bright) и светло-серого (белый+bright) выглядела убедительнее, чем попытки смешивать, например, синий и красный?
3. Контекст — всё. Эффективность сглаживания сильно зависит от фона.
· На однородном фоне можно позволить себе растянуть переход на несколько знакомест.
· На пестром или текстурном фоне эти попытки часто разваливаются, создавая лишь «грязь».
· Как вы решаете, когда стоит заморачиваться со сглаживанием, а когда честные «лесенки» выглядят стилистически уместнее?
4. Аппаратные трюки и полупиксели. Здесь вопрос к гуру. Существуют ли (или возможны ли в принципе) методы псевдо-сглаживания с использованием аппаратных особенностей? Например:
· Микропоскроллирование кадра или области для размытия (крайне сомнительно по производительности).
· Использование интерференции ULA+ для создания промежуточных оттенков на границах (как в некоторых демках).
· Быстрое переключение атрибутов (вроде FLI) в одной строке для более сложных градиентов.
5. Практика и примеры. Это самый важный блок. Давайте не только говорить, но и показывать.
· Есть ли у вас наработки — скриншоты, где ваш метод сглаживания выглядит победоносно?
· А может, наоборот, есть пример, где попытка всё сгладить привела к худшему результату, чем грубая пиксельная графика? Почему так вышло?
· Поделитесь, если не жалко, кодом ключевых процедур. Интересно сравнить компромисс между качеством картинки, скоростью отрисовки и размером кода.
Итог и цель темы:
Попробуем отойти от вопроса «можно ли» (можно всё, было бы время и память) к вопросу «как это сделать целесообразно». Собрать в одной теме не просто теорию, а практические рецепты, готовые процедуры и наглядные сравнения, которые помогут принимать взвешенные решения при отрисовке следующей игры или демки.
Жду ваших примеров, кода и мнений!
Хочу поднять, возможно, философский, но очень практический вопрос, который возникает при отрисовке плавных линий, кривых и диагоналей. Речь о сглаживании (антиалиасинге).
На современных системах это решается на уровне железа или сложных шейдеров. Нашем же случае — это чистой воды искусство обмана зрения в условиях жесточайших ограничений (2 цвета в атрибуте, жёсткая сетка знакомест).
Давайте разберем тему по косточкам:
1. Классические приёмы и «спектрум-джиттер». Самый известный метод — использование двух соседних атрибутов для создания третьего, промежуточного цвета за счёт мерцания (dithering). Но это работает только в статике или очень медленной анимации. Какие ещё классические алгоритмы (например, упрощённый алгоритм Ву для линии) реально применимы на Z80? Есть ли у кого готовая, вылизанная подпрограмма рисования сглаженной линии?
2. Цвет vs. Яркость. Из-за особенностей атрибутов, иногда эффективнее сглаживать не переход между цветами (ink/paper), а между яркостями (BRIGHT). Была ли у вас практика, когда сглаженная серая шкала из чёрного, темно-серого (черный+bright) и светло-серого (белый+bright) выглядела убедительнее, чем попытки смешивать, например, синий и красный?
3. Контекст — всё. Эффективность сглаживания сильно зависит от фона.
· На однородном фоне можно позволить себе растянуть переход на несколько знакомест.
· На пестром или текстурном фоне эти попытки часто разваливаются, создавая лишь «грязь».
· Как вы решаете, когда стоит заморачиваться со сглаживанием, а когда честные «лесенки» выглядят стилистически уместнее?
4. Аппаратные трюки и полупиксели. Здесь вопрос к гуру. Существуют ли (или возможны ли в принципе) методы псевдо-сглаживания с использованием аппаратных особенностей? Например:
· Микропоскроллирование кадра или области для размытия (крайне сомнительно по производительности).
· Использование интерференции ULA+ для создания промежуточных оттенков на границах (как в некоторых демках).
· Быстрое переключение атрибутов (вроде FLI) в одной строке для более сложных градиентов.
5. Практика и примеры. Это самый важный блок. Давайте не только говорить, но и показывать.
· Есть ли у вас наработки — скриншоты, где ваш метод сглаживания выглядит победоносно?
· А может, наоборот, есть пример, где попытка всё сгладить привела к худшему результату, чем грубая пиксельная графика? Почему так вышло?
· Поделитесь, если не жалко, кодом ключевых процедур. Интересно сравнить компромисс между качеством картинки, скоростью отрисовки и размером кода.
Итог и цель темы:
Попробуем отойти от вопроса «можно ли» (можно всё, было бы время и память) к вопросу «как это сделать целесообразно». Собрать в одной теме не просто теорию, а практические рецепты, готовые процедуры и наглядные сравнения, которые помогут принимать взвешенные решения при отрисовке следующей игры или демки.
Жду ваших примеров, кода и мнений!