„Az összevisszaságban találd meg az egyszerűséget, a hangzavarban a harmóniát...”

CRT szimuláció 1k-ban

Az 1k demót itt találod. (Az 5. helyet csíptem meg vele a 74 nevezésből.)

Visszatérő téma a blogon a CRT megjelenítők emulációja szimulációja. Ennek egyik oka, hogy a régi dolgok visszanézése a mai monitorokon az eredetileg megálmodott képi világhoz képest nagyon különböző eredményt ad. A pixelek közötti tűéles határvonalak, a precíz színvilág, a scan lineok hiánya, a villódzásmentes, teljesen steril kép távol áll az eredeti élménytől. A másik ok Rihardo, akinek szintén szívügye ez a téma, és folyton ilyen témákkal nyaggat, miközben minduntalan keresi a tökéletes szimulációt nyújtó megoldásokat.

Egy régi játék esetében, amit TV-s megjelenítésre találtak ki, a grafikusok tudatában voltak a képernyő sajátosságaival, és eszerint rajzoltak, vagyis belekalkulálták a CRT által nyújtott "effekteket". Ma már nagyon jó valós emulációk vannak, a legjobb ezek közül talán a micro64 által megvalósított hatás, amiben még az a bizonyos őrületbe kergető magasfrekvenciás hang is jelen van, ami a képernyő világosságával egyenes arányban egyre hangosabban sípol. Ez az a hang, ami alapján az utcáról meg lehet állapítani, hogy a ház előtt ahol épp sétálsz, be van-e kapcsolva a TV odabenn.

Ha nagyon közelről belenézünk egy régi TV képernyőjébe, akkor apró piros, zöld, kék csíkok láthatóak egymás mellett. Egy ilyen hármas alkot egyetlen pixelt. Ezek a csíkok világítanak különböző fényerővel, aszerint, hogy milyen színt kell megjeleníteni. Tehát igazából a képernyőn csak ez a három szín van jelen, megfelelően távolról nézve azonban azt a hatást kelti, mintha bármilyen szín ábrázolható volna.

Én épp ezt a hatást szerettem volna megvalósítani. Az egész mögött a logika annyi, hogy mivel a mai monitorokon úgyis olyan sűrűn vannak a pixelek egymás mellett, egy pixelt csupán egy ilyen szegmensnek szentelek. Tehát az első pixelen az eredeti színnek csak a piros színösszetevőjét ábrázolom, az azt követőn csak a zöldet, majd csak a kéket. Tehát három pixelt használok fel egyetlen pixel kirakásához. Magasságban ugyanígy, három pixel hosszú egy szegmens, hogy ne torzuljanak a kép arányai.

Kíváncsian vártam, hogy mi sül ki belőle. Feltöltöttem az első képet, egy C64-es játék képét, és az eredmény fantasztikus lett. Pontosan azt a hatást kaptam vissza, mint amit elméletben elképzeltem. Távolról nézve a kép látszik, kicsit szemcsésebben, az eredeti színeiben. Közelről viszont látni, hogy a kép csak piros, zöld és kék színből áll, és pusztán ezek közelsége miatt látható távolról úgy, hogy minden szín jelen van. De mivel még így, háromszorosan "lebutítva" is túl finom volt a monitorom felbontása (2560x1440), ezért a duplájára, vagyis hatra emeltem a lépésközt, tehát egy színszegmens 2 pixelcsíkból áll, és 6 pixel magas. Illetve csak öt, ugyanis a scan lineok hatását ezzel az egy feketén maradó alsó pixelsorral oldottam meg.

A régi TV képernyők felülete nem egyenes volt, hanem gömbölyű, középen kidomborodott. A még jobb hatás érdekében ezt is megvalósítottam. Az elmélet itt is teljesen egyszerű, a képre egy átlátszó radial gradienst raktam, ami a kép sarkai felé érve egyre sötétedik. Már ez önmagában kelt valamennyi görbítéses hatást a sík képen, de a kegyelemdöfést a barrel distortion (hordótorzítás) effekttel együtt nyújtja. 1k-ba sűrítve nem volt egyszerű, de így a kép már valóban térbelinek tűnik, a közepe kidomborodik, a sarkai pedig távolinak tűnnek, aminek a hatását a fekete gradiens csak tovább növeli.

CRT szimulációKattints a képre az eredeti méretben való megjelenítéshez

Az elmélet annyira szépen működik a gyakorlatban, hogy a görbítés és a valós RGB szegmenses ábrázolás miatt még azok a fura körkörös jelenségek is megfigyelhetők a kép oldalain, amik a TV képernyő lefényképezésekor is láthatóak. Az 1k-ba még finom fényerő villogtatás, és egy kis zaj fért bele, hogy mégse teljesen stabil legyen a kép. Akartam még bele 50Hz-es képfrissítést idéző, szemet roncsoló effektust is, illetve a már említett 15625Hz frekvenciájú sípolást is, és bár remekül működtek, és sokat hozzáadtak az élményhez, de végül ember ellenes bűntettnek minősítettem ezeket, így a végső, 999 bájtos programba nem kerültek bele.

Ja, és hogy miért 1k? Hát azért, mert idén is megrendezésre került a js1k demóverseny, amin már egyszer indultam, illetve én szeretem a dolgokat összekötni. Önmagában egy CRT szimuláció nem nagy szám. Úgy, ahogyan az 1k-s javaScript demó sem. Viszont ha kombináljuk a kettőt, akkor már érdemes a dolog a megtekintésre.

Az 1k-ba való belezsúfolás ismét jó pár napra elegendő agymunkát adott. Nagyon élveztem az algoritmusok egyszerűsítését, és a minimalizálás folyamatát. Ez az amit a legjobban szeretek csinálni az egész programozásban. Egy a baj vele, hogy nagyon viszi az időt. Észre sem veszi az ember, és máris hajnali kettő van, de kit érdekel ez akkor, amikor délután hat óta már öt bájtot sikerült fogni a kódon. Mert egyszerűsíteni a végtelenségig lehet, ehhez kétség sem fér.

A demo adatlapja és részletei: adatlap
És a demo linkje még egyszer: DEMO