Кольори, які сваряться: феномен attribute clash
На ZX Spectrum колір задавали не для кожної точки, а для цілої клітинки 8×8 — і тому фігури на екрані часто «фарбували» тло навколо себе. Розбираємо, як економія пам'яті створила найвпізнаваніший візуальний почерк платформи.
Attribute clash — не поломка, а прямий наслідок того, що колір на Spectrum коштував пам'яті: два кольори на клітинку 8×8 замість кольору на кожну точку. Це обмеження художники навчилися не приховувати, а перетворювати на стиль.
Attribute clash — це обмеження кольору, а не роздільної здатності. Точкова сітка Spectrum — 256×192, доволі детальна; «грубою» була саме колірна сітка 32×24 клітинки. Не плутати брак кольору з браком чіткості.
Кольори, яких мало
У розборі архітектури ми побачили, що зображення на ZX Spectrum лежить у пам’яті двома блоками: окремо — які точки засвічені, окремо — якого вони кольору. І якщо на точки машина витрачала 6144 байти, то на весь колір — лише 768. Ця диспропорція й породила найвпізнаваніший візуальний ефект платформи, який увійшов в історію під назвою attribute clash — «злипання» або «сварка» кольорів.
Головна теза цього тексту: attribute clash — не поломка й не недогляд програмістів, а прямий наслідок того, що колір на Spectrum коштував пам’яті. Розберімо, як саме влаштований цей колір, чому фігури «фарбують» тло навколо себе — і як художники перетворили обмеження на стиль.
Один байт на клітинку 8×8
Екран Spectrum поділений на клітинки розміром 8×8 точок — усього 32 по горизонталі та 24 по вертикалі. Колір задається не для кожної точки, а для цілої такої клітинки: на неї припадає один байт атрибута.
У цьому байті вісім бітів розподілені так: три молодші задають колір «чорнила» (INK) — тобто засвічених точок; наступні три — колір «паперу» (PAPER), тобто тла; ще один біт вмикає підвищену яскравість (BRIGHT), а старший — мерехтіння (FLASH), яке періодично міняє чорнило й папір місцями. Ці ж команди — INK, PAPER, BRIGHT, FLASH — доступні програмісту прямо з мови Sinclair BASIC.
Наслідок арифметики простий: у межах однієї клітинки 8×8 може бути лише два кольори — одне чорнило й один папір. Уся палітра — 15 кольорів: вісім базових (чорний, синій, червоний, пурпуровий, зелений, блакитний, жовтий, білий) у двох рівнях яскравості, причому чорний в обох однаковий, тож різних відтінків виходить п’ятнадцять, а не шістнадцять. Є й додаткове обмеження: біт яскравості один на всю клітинку, тож яскраве чорнило й неяскравий папір в одній клітинці поєднати не можна — обидва кольори мусять бути або з «яскравої», або зі «звичайної» половини палітри.
Що таке attribute clash
Тепер уявімо рухому фігуру — скажімо, спрайт героя, — яка їде екраном по тлу іншого кольору. Точки фігури машина може ввімкнути з точністю до однієї: тут пиксельна сітка детальна. А от колір вона змінює цілими клітинками 8×8. Щойно край фігури заходить у клітинку, більша частина якої — тло, уся ця клітинка мусить прийняти лише два кольори на двох. Результат: або фігура «перефарбовує» шматок тла у свій колір, або сама набуває кольору тла. На межах виникають характерні кольорові плями, які «стрибають» слідом за рухом. Це і є attribute clash.
Причина, як бачимо, суто економічна. Колірну підсистему свідомо спроєктували так, щоб вона займала якнайменше пам’яті й була зручною передусім для тексту, а не для рухомої графіки: символу, що й так уміщується у клітинку 8×8, двох кольорів цілком досить. Ігри ж, де по екрану літають спрайти, наштовхувалися на це обмеження щокадру.
Спадковість схеми. Attribute clash — це та сама логіка економії, що й гумова клавіатура чи чип ULA: прибрати витрати там, де без них можна обійтися. Зберігати колір для кожної точки означало б у кілька разів більше відеопам’яті — а отже, дорожчу машину. Spectrum обрав дешевизну й прийняв її візуальні наслідки.
Як художники обходили обмеження
Найцікавіше почалося тоді, коли програмісти перестали боротися з обмеженням і почали проєктувати навколо нього. Прийомів було кілька.
Найрадикальніший — відмовитися від кольору там, де рух. Ігри на кшталт Knight Lore малювали дію монохромно: одна пара кольорів на всю ігрову зону — і клашу просто нема звідки взятися. Візуально це дало впізнаваний «об’ємний» чорно-білий стиль.
Інший шлях — узгодити графіку з сіткою. Художники проєктували спрайти та їхні траєкторії так, щоб вони по змозі рухалися й вирівнювалися по межах 8×8. Дон Прістлі у своїх іграх (Popeye, The Trap Door) пішов далі: його великі «мультяшні» фігури свідомо займали цілі клітинки, тож колір не «протікав» на тло. А гра Light Force прославилася тим, що досягла повнокольорової рухомої графіки майже без клашу — ціною надзвичайно ретельного дизайну кожного екрана.
Був і суто технічний трюк: змінювати колірну область пам’яті точно в ті моменти, коли промінь телевізора малює певну частину екрана. Це вимагало виверткого коду, синхронізованого з розгорткою, — той самий тісний зв’язок таймінгу й екрана, про який ми говорили в розборі архітектури.
Обмеження, що стало стилем
Минули роки — і виявилося, що саме attribute clash став візуальним підписом Spectrum. Ті кольорові плями, монохромні світи Knight Lore, великі блочні спрайти — усе це сьогодні впізнають з першого погляду. Те, що інженерно було компромісом заради ціни, естетично перетворилося на характер платформи, який досі свідомо наслідують автори сучасних «спектрумівських» ігор.
Для музею це знову той самий урок, що проходить крізь увесь блок про Spectrum: обмеження не тільки псують — вони формують. Художник, змушений працювати з двома кольорами на клітинку, винаходив рішення, яких ніколи не шукав би за повної свободи.
Експонат музею
Attribute clash найкраще не описувати, а бачити. На робочій 48-КБ моделі в експозиції музею ми запускаємо ігри тих років — і ефект видно наживо: варто рухомій фігурі перетнути тло іншого кольору, як межа клітинки 8×8 «спалахує» чужою барвою. На екскурсії ми показуємо і сам клаш, і прийоми, якими його приборкували, — так абстрактне обмеження стає зрозумілим за кілька секунд біля екрана.
Джерела
- Attribute clash — Wikipedia (англ.) — en.wikipedia.org
- ZX Spectrum — Wikipedia (англ.) — en.wikipedia.org
- ZX Spectrum BASIC Manual, розділ 16 «Colours» — World of Spectrum — worldofspectrum.org
- Sinclair ZX Spectrum 48K — Centre for Computing History — computinghistory.org.uk