Atari 2600'den SNES'e: 128 byte RAM ile nasıl oyun yapılır? Kısıtlamalar yaratıcılığı nasıl tetikledi?
Bu sayfa, Bölüm 1: Bilgisayar Grafiğine Giriş dersinin ek okuma materyalidir. Erken dönem oyun konsolları ve bilgisayarların grafik donanım sınırlamalarını ve programcıların bu kısıtlamalar karşısında geliştirdikleri yaratıcı teknikleri detaylı olarak ele alır. Bu konular, modern grafik programlamanın neden bugünkü haliyle var olduğunu anlamanız için kritik öneme sahiptir.
Bugün bir oyun motoru size saniyede milyarlarca piksel işleyebilen GPU'lar sunuyor. Ama kısıtlama altında çalışma becerisi her zaman geçerli: mobil oyunlar, web grafikleri, gömülü sistemler, VR (düşük gecikme zorunluluğu)... Ayrıca bu tarihsel teknikler — tile tabanlı render, sprite atlas, palet döngüsü, dithering — modern oyun geliştirmede hâlâ aktif olarak kullanılıyor. Kısıtlama, yaratıcılığın anasıdır.
Atari 2600 (1977), ev oyun konsolları tarihinin en önemli cihazlarından biridir ve grafik programlamanın en aşırı kısıtlama örneklerinden birini sunar. Bugün bir web sayfası bile megabyte'larca RAM kullanırken, Atari 2600 programcıları sadece 128 byte (evet, byte — kilobyte değil!) RAM ile oyun yapmak zorundaydı.
Modern grafik sistemlerinde bir frame buffer (çerçeve arabelleği) vardır — ekrandaki her pikselin renk değerini tutan bir bellek alanı. GPU bu belleğe yazar, ekran kartı bu bellekten okur ve görüntüyü ekrana gönderir. Ama Atari 2600'ün TIA çipinde frame buffer diye bir şey yoktu. Neden? Çünkü 160×192 piksellik bir ekranı saklamak için bile yaklaşık 30 KB bellek gerekirdi — oysa sistemin toplam RAM'i 128 byte'dı!
Bunun yerine TIA, her satırı (scanline) tek tek, gerçek zamanlı olarak televizyonun elektron ışını o satırı çizerken üretiyordu. Programcının işi, elektron ışınının her satırına yetişmekti.
Bunu anlamak için CRT (katot ışınlı tüp) televizyonları bilmek gerekir: CRT'de bir elektron ışını ekranı soldan sağa, yukarıdan aşağıya tarar. Her yatay satır (scanline) soldan sağa çizilir, sonra ışın sağ kenardan sol kenara geri döner (horizontal blank — HBLANK), ardından sonraki satır çizilir. Ekranın en altına ulaşıldığında ışın tekrar en üste döner (vertical blank — VBLANK). NTSC'de bu süreç saniyede ~60 kez tekrarlanır (60 Hz). Tüm süreç: 262 satır × 228 CPU döngüsü/satır.
TIA çipi herhangi bir bitmap saklayamadığı için, her scanline'da sabit sayıda grafik nesnesi üretebiliyordu:
| Nesne | Genişlik | Açıklama |
|---|---|---|
| Playfield (PF) | 40 "piksel" (20-bit pattern, yansıtılabilir) | Arka plan. 20-bit'lik bir değer sol yarıyı tanımlar; sağ yarı ya kopyalanır ya yansıtılır. Her "piksel" aslında 4 CPU piksel genişliğinde. |
| Player 0 (P0) | 8 piksel genişliğinde sprite | Birinci oyuncu sprite'ı. 8-bit register ile tanımlanır. 1x, 2x, 4x ölçeklenebilir. |
| Player 1 (P1) | 8 piksel genişliğinde sprite | İkinci oyuncu sprite'ı. P0 ile aynı yetenekler. |
| Missile 0 (M0) | 1, 2, 4 veya 8 piksel | P0'a bağlı mermi nesnesi. Tek renk, ayarlanabilir genişlik. |
| Missile 1 (M1) | 1, 2, 4 veya 8 piksel | P1'e bağlı mermi nesnesi. |
| Ball (BL) | 1, 2, 4 veya 8 piksel | Playfield'a bağlı top nesnesi. Pong'daki top için tasarlandı! |
Yani bir scanline'da toplamda sadece 2 sprite + 2 mermi + 1 top + 1 arka plan. Hepsi bu. Bugünkü oyunlarda tek bir karede binlerce nesne olabilir — Atari 2600'de 6 taneyle yetinmek zorundasınız.
İşte Atari 2600 programcılığının özü burada: "Racing the Beam" (Işınla Yarışmak). Bu terim, Nick Montfort ve Ian Bogost'un 2009 tarihli aynı adlı kitabından popülerleşmiştir. Teknik şöyle çalışır:
Her scanline'da CPU'nun yalnızca ~76 döngüsü vardı ve bir 6507 talimatı 2-7 döngü arasında sürer. Yani bir satır başına yaklaşık 15-30 CPU talimatı çalıştırabilirsiniz. İşte bu yüzden her döngü, her talimat hesaplanırdı. Programcılar kodlarını döngü sayarak (cycle counting) yazardı.
Oyun geliştirme tarihinin ilk "Easter Egg"i bu oyundadır. Ama grafik açıdan da ilginçtir: oyuncunuz ekranda sadece bir karedir (bir dikdörtgen!). Ejderhalar? Ördek gibi görünen şekiller. Kısıtlama o kadar büyüktü ki tasarımcı "iyi görünen" şeyler yerine "anlaşılabilir" şeyler yapmak zorunda kaldı. Player sprite'ı sadece 8 piksel genişliğinde olduğu için ejderhanın ağzı, gövdesi ve kanatları hep 8-piksellik bantlarla oluşturulmuştur.
Activision'ın efsanevi oyunu. David Crane, ormandaki ağaçları, lianlardaki sallanmayı ve koşan karakteri 128 byte RAM'de oluşturmak için playfield register'larını her birkaç scanline'da bir değiştiriyordu. Arka plan detayı oluşturmak için "asymmetric playfield" tekniğini kullanarak sol ve sağ yarımı farklı pattern'lerle doldurdu — bu normalde TIA'nın desteklemediği bir şeydi ama HBLANK sırasında register'ı değiştirerek başardı.
Ekranın ortasındaki "nötr bölge" aslında oyunun kendi ROM verisinin ham byte'larının piksel olarak ekrana basılmasıydı! Yani oyunun kendi kodu görsel efekt olarak kullanıldı. Bu, bellek tasarrufu için inanılmaz yaratıcı bir çözümdü.
Karşılaştırma: Bu paragrafı okuduğunuz web sayfası tarayıcınızda muhtemelen 100+ MB RAM kullanıyor. Atari 2600'ün toplam RAM'i 128 byte — yani bu web sayfası Atari 2600'ün RAM'ının yaklaşık 800.000 katı bellek kullanıyor. Bu kısıtlamada Pitfall gibi bir oyun yapmak, bugünkü perspektiften bakıldığında neredeyse imkânsız görünür.
"Racing the beam" mantığı aslında tamamen ölmedi. Modern GPU'lar da scanline bazlı işlemeye benzer teknikler kullanır: tile-based rendering (özellikle mobil GPU'larda — ARM Mali, Qualcomm Adreno, Apple GPU) ekranı küçük dörtgenlere böler ve her birini sırayla işler — tıpkı Atari'nin satır satır çalışması gibi, ama çok daha sofistike. Ayrıca shader programlama da aslında "her piksel/vertex için çalışacak kodu yaz" felsefesiyle çalışır.
Nintendo Entertainment System (NES, Japonya'da Famicom — Family Computer, 1983) ev konsollarını diriltmiş ve modern oyun endüstrisinin temellerini atmıştır. Grafik yetenekleri Atari 2600'e göre devasa bir sıçramaydı, ama günümüz standartlarıyla baktığımızda hâlâ çok kısıtlıydı. NES, bu kısıtlamalar içinde üretilen oyunlarla (Super Mario Bros., The Legend of Zelda, Mega Man) oyun tarihinin en ikonik eserlerini çıkardı.
NES'in grafik işlemcisi olan PPU (Ricoh 2C02), CPU'dan bağımsız çalışan özel bir grafik çipiydi. Bu, Atari 2600'e kıyasla büyük bir gelişmeydi — artık CPU her scanline'ı elle oluşturmak zorunda değildi.
NES, ekranı doğrudan piksel piksel adreslemez. Bunun yerine tile (karo/döşeme) tabanlı bir sistem kullanır. Tüm grafikler 8×8 piksellik tile'lardan oluşur. Bu tile'lar Pattern Table (CHR-ROM veya CHR-RAM) adı verilen bir bellekte saklanır ve kartuş üzerindeki ROM'dan gelir.
Ekran 32×30 = 960 tile'dan oluşur. Her tile'ın hangi pattern'i kullanacağı Nametable'da belirtilir. Her 2×2 (16×16 piksel) tile bloğu bir attribute byte paylaşır — bu byte hangi 4 renklik paletin kullanılacağını söyler.
Sonuç: 16×16 piksellik bloklar aynı renk paletini paylaşmak zorunda. İnce detaylı arka planlar bu yüzden zordur.
64 sprite aynı anda bellekte tutulabilir (OAM — Object Attribute Memory, 256 byte). Her sprite 4 byte kullanır: Y pozisyonu, tile index, attribute (palet, yansıtma), X pozisyonu.
Her sprite 8×8 veya 8×16 piksel boyutundadır. Her sprite 4 renk paletinden birini kullanır ve her paletten 3 renk + şeffaflık (transparent) seçilebilir.
NES'in master paleti 54 benzersiz renk içerir (teknik olarak 64 giriş vardır ama yaklaşık 10 tanesi birebir siyah veya uyumsuz renk tekrarlarıdır). Bu renkler donanımda sabittir — değiştirilemez. Oyun geliştiricisi bu 54 renkten seçim yaparak paletlerini oluşturur:
| Palet Türü | Adet | Renk/Palet | Toplam |
|---|---|---|---|
| Arka plan paletleri | 4 palet | 3 renk + 1 ortak arka plan rengi | 12 benzersiz + 1 ortak = 13 |
| Sprite paletleri | 4 palet | 3 renk + şeffaflık | 12 benzersiz |
| Toplam ekranda aynı anda | 25 renk | ||
Karşılaştırma için: bugün RGB renk uzayında 16.7 milyon renk (24-bit, 2²⁴) kullanabilirsiniz. NES'te 25. Bu kısıtlama altında renkli, canlı ve tanınabilir oyun dünyaları yaratmak büyük ustalık gerektiriyordu.
NES PPU'sunun en bilinen kısıtlamalarından biri "scanline başına 8 sprite" sınırıdır. PPU, herhangi bir yatay scanline boyunca en fazla 8 sprite çizebilir. 9. ve sonraki sprite'lar o satırda görünmez hale gelir.
Ekranda yatay olarak hizalanmış 8'den fazla düşman veya obje olduğunda bazıları kaybolur. Bu, özellikle aksiyon oyunlarında ciddi bir sorundu — bir sürü düşman aynı yatay çizgide durabilir!
Geliştiriciler bu soruna akıllıca bir çözüm buldular: sprite titreşimi (flickering). Her karede (frame), hangi 8 sprite'ın o scanline'da gösterileceğini değiştirerek (rotate ederek), tüm sprite'ların saniyede 30 kez görünmesini sağlıyorlardı. İnsan gözü bunu hızlı bir titreşim olarak algılar — sprite kaybolmak yerine "yarı saydam" görünür. Mükemmel değil ama hiç görünmemekten çok daha iyi!
Mega Man serisi, sprite flickering'in en bilinen örneklerinden biridir. Ekranda çok sayıda düşman ve mermi olduğunda bazı sprite'lar titrer. Capcom bu sorunu minimize etmek için sprite öncelik rotasyonu (priority cycling) uyguladı — böylece her zaman rastgele bir sprite kaybolur, aynısı sürekli kaybolmaz.
Zelda'da bir odada çok fazla düşman olduğunda flickering görülür. Ama ilginç olan şu: tasarımcılar düşman sayısını ve yerleşimini bu sınıra göre tasarladılar. Düşmanlar genellikle farklı yatay çizgilere dağıtılarak sorun minimize edildi. Seviye tasarımı donanım kısıtlamasıyla doğrudan bağlantılıydı.
NES'in 2 KB VRAM'i iki nametable (32×30 tile = 960 byte + 64 byte attribute = 1024 byte) için yeterlidir. Ama kaydırmalı (scrolling) oyunlar genellikle dört nametable'a ihtiyaç duyar (256×240'ın 2 katı alan). Yetersiz VRAM'i telafi etmek için nametable mirroring kullanılır:
İki fiziksel nametable üst-alt olarak düzenlenir. Dikey kaydırma (vertical scrolling) yapan oyunlar için idealdir — örn: shoot-em-up oyunları (1942, Gun.Smoke). Yatay yönde kaydırma yapıldığında nametable sınırında grafik hataları ("seam") oluşabilir.
İki fiziksel nametable yan yana düzenlenir. Yatay kaydırma (horizontal scrolling) yapan oyunlar için idealdir — örn: Super Mario Bros., Castlevania. Dikey yönde ek bellek yoktur; çoğu platformer bu modeli kullanır.
Shigeru Miyamoto'nun Super Mario Bros. (1985) için Mario karakterini nasıl tasarladığı, donanım kısıtlamalarının yaratıcılığı nasıl yönlendirebileceğinin en ünlü örneğidir. Mario'nun ikonik görünümünün her detayı bir teknik sınırlamanın çözümüdür:
| Tasarım Öğesi | Teknik Neden |
|---|---|
| 🧢 Şapka (Kep) | Saç animasyonu son derece zordur — 8×8 veya 8×16 sprite'larda saç detayı çizmek ve koşarken doğal görünmesini sağlamak çok fazla tile gerektirir. Şapka bu sorunu ortadan kaldırdı. Tek renkli düz bir alan yeter. |
| 👨 Bıyık | Ağız animasyonu (konuşma, gülümseme) çok sayıda sprite frame'i gerektirir. Bıyık, ağzı gizleyerek yüz animasyonu ihtiyacını ortadan kaldırdı. Ayrıca bıyık, ten rengi ile yüz arasında kontrast oluşturarak burunu belirginleştirdi — 8×8'lik tile'da yüz hatlarını ayırt etmek başka türlü çok zordu. |
| 👕 Tulum (Overalls) | Koşma animasyonunda kollar ileri-geri hareket eder. Tulum, kol hareketinin gövdeyle birleştiği noktada renk kontrastı sağlar ve kolun ayrı göründüğü, az tile ile çizilebilmesini sağlar. Tulum ile gömlek farklı renkler olmasaydı, kol ve gövde ayrıştırılamazdı. |
| 🟤 Büyük Burun | 16×16 piksellik (2×2 tile) bir sprite'ta yüz ifadesi vermek neredeyse imkânsız. Büyük burun, karaktere kişilik vermenin en etkili yoluydu — 2-3 pikselle bile algılanabilir bir burun. |
| 🎨 Renk Seçimi (Kırmızı/Mavi) | NES sprite paleti 3 renk + şeffaflıktan oluşur. Mario'nun kırmızı-mavi-ten rengi kombinasyonu, minimum renk sayısıyla maksimum kontrast sağlar. Kırmızı arka planlardan (tuğla, boru) ayrışır, mavi tulum vücudu tanımlar. |
Shigeru Miyamoto bir röportajında şöyle demiştir: "Donanım sınırlamalarını seviyorum çünkü bizi yaratıcı olmaya zorluyorlar." Mario'nun bugün dünya genelinde tanınan ikonik görünümü, aslında tamamen teknik zorunlulukların ürünüdür. Eğer NES sınırsız renk ve çözünürlük sunsaydı, Mario muhtemelen bu kadar sade, temiz ve akılda kalıcı tasarlanmazdı. Kısıtlama → Basitlik → Evrensellik.
NES'in CPU'su 16-bit adres yolu ile çalışır — yani toplamda 64 KB adreslenebilir bellek. Bunun bir kısmı RAM'e, bir kısmı PPU register'larına, bir kısmı da I/O'ya ayrılmıştır. Kartuş ROM'u için kalan alan PRG-ROM: 32 KB, CHR-ROM: 8 KB'dır. Erken dönem oyunlar (Donkey Kong, Ice Climber) bu sınırlar içinde kaldı.
Ama oyunlar büyüdükçe bu alan yetmedi. Çözüm: kartuşların içine özel mapper çipleri yerleştirmek. Bu çipler bank switching yaparak, büyük ROM'un farklı bölümlerini CPU'nun görebildiği 32 KB'lık (veya 8 KB'lık CHR) pencereye eşlerdi.
En yaygın mapper'lardan biri. The Legend of Zelda, Metroid, Mega Man 2 gibi oyunlarda kullanıldı. 256 KB'a kadar PRG-ROM ve 128 KB'a kadar CHR-ROM destekler. Nametable mirroring'i yazılımla değiştirebilir — bu, oyun sırasında yatay ve dikey kaydırma arasında geçiş yapmayı mümkün kılar. 4-bit seri register üzerinden kontrol edilir (yavaş ama işlevsel).
En güçlü ve popüler mapper. Super Mario Bros. 3, Kirby's Adventure, Mega Man 3-6 ve yüzlerce başka oyunda kullanıldı. 512 KB PRG-ROM, 256 KB CHR-ROM destekler. En önemli özelliği scanline counter: PPU'nun hangi satırda olduğunu takip edebilir ve belirli bir satırda otomatik olarak IRQ (interrupt) tetikleyebilir. Bu, ekranın farklı bölümlerinde farklı scroll pozisyonları kullanmayı (split-screen efektleri), durum çubuğu (status bar) göstermeyi ve daha karmaşık grafik hileleri yapmayı mümkün kılar.
En gelişmiş resmi Nintendo mapper'ı. Castlevania III, Just Breed gibi oyunlarda kullanıldı. Ek RAM (8 KB), geliştirilmiş nametable kontrolü, sprite başına ayrı CHR bank seçimi ve çarpma donanımı (multiplication) gibi özellikler sunar. Çok güçlü ama üretim maliyeti yüksek olduğu için az kullanılmıştır.
Castlevania III (Japon versiyonu — Akumajō Densetsu) ve Madara'da kullanıldı. Ekstra ses kanalları (3 ek kanal!) ekleyerek müzik kalitesini dramatik şekilde artırdı. Japon Famicom kartuşlarında ses hatları CPU'ya bağlandığı için bu mümkündü; NES'in farklı kartuş pin yapısı bu ek sesi desteklemiyordu. Bu yüzden Castlevania III'ün Japon ve Amerikan versiyonlarının müziği çok farklıdır!
Bank switching, modern programlamanın "virtual memory" (sanal bellek) kavramının atası sayılabilir. Aynı adres aralığına farklı veri blokları eşlenebilir. CPU 32 KB'lık bir pencereden bakıyor gibi görür ama mapper çipi arka planda hangi 32 KB'lık dilimi göstereceğini seçer. Bu, kilobyte'larla ölçülen ROM boyutunu megabyte'lara çıkaran bir dahice çözümdü. Bugünkü GPU'lardaki texture streaming ve bellek yönetimi de aslında aynı temel fikri kullanır.
Commodore 64 (1982), tarihin en çok satan kişisel bilgisayarıdır (~17 milyon adet). Oyun konsollarından farklı olarak tam bir bilgisayardı (BASIC programlama dili, klavye, disk sürücü desteği), ama grafik ve ses yetenekleri dönemin oyun konsollarıyla yarışacak düzeydeydi — hatta çoğunu aşıyordu.
C64'ün dikdörtgen piksel kavramı önemlidir: Multicolor modunda yatay çözünürlük 160'a düşer ama pikseller gerçek kare değil, yatayda iki kat geniş dikdörtgenler olur. Bu, her 8×8 karakter bloğunda 4 renk kullanım hakkı verir (hi-res modunda sadece 2). Sanatçılar bu dikdörtgen pikselleri "geniş piksel" olarak kullan mak zorundaydı — bu da özel bir estetik yarattı.
Tam çözünürlük, ama her 8×8 karakter hücresinde sadece 2 renk — bir arka plan, bir ön plan. Detaylı çizimler yapılabilir ama renk çeşitliliği çok kısıtlı. Grafik programları (Koala Painter gibi) genellikle multicolor'u tercih ederdi.
Yarı yatay çözünürlük, ama her 8×8 blokta 4 renk: 1 arka plan (global), 2 ortak renk (tüm bloklar paylaşır), 1 bireysel renk. Renkli görüntüler için tercih edilir. Dikdörtgen pikseller karakteristik "retro" görünümü oluşturur.
VIC-II çipinin en güçlü özelliklerinden biri raster interrupt desteğidir. Belirli bir scanline'a ulaşıldığında otomatik olarak CPU'ya interrupt (kesme) gönderir. Bu, programcılara inanılmaz güç verir:
Grafik konumuz olsa da C64'ün SID (Sound Interface Device — MOS 6581) çipini anmamak olmaz. Bob Yannes tarafından tasarlanan SID, 3 bağımsız ses kanalı, 4 dalga formu (sawtooth, triangle, pulse, noise), ADSR zarfı, ring modülasyon ve filtre desteği sunar. Ev bilgisayarlarında/konsollarında daha önce görülmemiş bir ses kalitesi sağladı ve bugün hâlâ müzisyenler tarafından "chiptune" müzik yapmak için kullanılır. SID, C64'ün oyun ve demo sahnesindeki başarısının en büyük nedenlerinden biridir — grafik ve ses birlikte güçlü bir deneyim yaratıyordu.
C64 "demoscene" kültürünün doğum yerlerinden biridir. Demo sahnesi, görsel-işitsel sunumlar (demo'lar) yaratan, donanımın ne yaptığının ötesinde neler yapabileceğini gösteren bir alt kültürdür. 2024'te UNESCO tarafından somut olmayan kültürel miras olarak tescil edilmiştir.
Demoscene programcıları (scener'lar):
Demo sahnesi, donanım sınırlamalarını sanat biçimine dönüştürmenin en saf örneğidir. Grafik bir zorunluluktan "ne kadar ileri gidebiliriz?" sorusuna dönüşmüştür.
Nintendo Game Boy (1989), teknik olarak çıktığında bile eski teknoloji kullanıyordu — ama düşük maliyet, uzun pil ömrü ve mükemmel oyun kütüphanesi sayesinde 118 milyon adetten fazla sattı (Game Boy Color dahil). Grafik açıdan en belirgin özelliği: sadece 4 ton yeşilimsi gri.
Game Boy, NES gibi tile tabanlı render sistemi kullanır. Tüm grafikler 8×8 piksellik tile'lardan oluşur. Her piksel 2-bit (4 olası değer: 0, 1, 2, 3 — en açık ton → en koyu ton). VRAM'de en fazla 256 benzersiz tile (0-255 numaralı) saklanabilir ve arka plan haritası (32×32 tile = 256×256 piksel) bu tile numaralarından oluşur.
Pokémon Red/Blue/Green (1996), Game Boy'un en başarılı oyunlarındandır ve 4 tonluk grafik kısıtlamasının ne kadar yaratıcı kullanılabileceğini gösterir. Ken Sugimori ve ekibi 151 farklı yaratık tasarlarken ellerinde sadece 4 ton vardı.
Game Boy Color, çözünürlüğü aynı tutarak (160×144) renk desteği ekledi: 32.768 renklik paletten aynı anda 56 renk (arka plan: 8 palet × 4 renk = 32 + sprite: 8 palet × 3 renk + şeffaflık = 24). Bu, orijinal Game Boy oyunlarına otomatik renk ekleme ("colorize") özelliği de dahil olmak üzere büyük bir sıçramaydı. Ama aynı tile tabanlı mimari korundu — yani temel kısıtlamalar ve tasarım prensipleri aynen geçerliydi.
Super Nintendo Entertainment System (SNES/Super Famicom, 1990) neslin en güçlü konsollarından biriydi ve grafik açıdan en dikkat çekici özelliği Mode 7 adı verilen özel bir arka plan moduydu. Mode 7, bir arka plan katmanına döndürme (rotation), ölçekleme (scaling), eğme (skewing) ve perspektif dönüşümü uygulayarak sahte 3D (pseudo-3D) efektler yaratabiliyordu.
Mode 7, matematiksel olarak bir afin dönüşüm (affine transformation) matris çarpımı uygular. Her scanline için, SNES PPU'su bir 2D arka plan haritasını (1024×1024 piksellik bir tile haritası, her tile 8×8 piksel) şu parametrelere göre dönüştürür:
[ x' ] = [ A B ] × [ x - x₀ ] + [ x₀ ]
[ y' ] [ C D ] [ y - y₀ ] [ y₀ ]
A, B, C, D parametreleri her scanline için ayrı ayrı ayarlanabilir. Hdma (H-Blank DMA) kullanarak her scanline'da bu parametreleri otomatik olarak değiştirmek, perspektif efekti yaratmanın anahtarıdır: ekranın üst kısmıiçin küçük ölçek (uzak), alt kısmı için büyük ölçek (yakın) → 3D zemin illüzyonu!
SNES'in lansman oyunlarından biri ve Mode 7'nin en ikonik kullanımı. Yarış pisti düz bir 2D haritadır ve Mode 7 bu haritayı perspektif projeksiyon ile 3D zemin gibi gösterir. Virajlarda döndürme, rampada ölçekleme kullanılır. 60 fps'de akıcı sahte 3D yarış — 1990'da bu gerçekten etkileyiciydi. 3D modelleme veya poligon yok — hepsi 2D texture dönüşümü.
Mode 7'yi yol yüzeyi için kullanır, ama inovasyonu sprite scaling ile karakterlerin (diğer yarışçıların) uzaklığa göre büyütülüp küçültülmesidir. Aslında diğer araçlar 3D model değil, farklı açılardan önceden çizilmiş 2D sprite'lardır. Mode 7 zemin + ölçeklenmiş sprite'lar = ikna edici 3D yarış. Nintendo'nun dahice tasarım kararlarıyla dünyanın en ikonik yarış oyunlarından biri doğdu.
Uçak ve paraşüt simülasyonu. Mode 7, arazinin kuşbakışı görünümünü oluşturur; alçaldıkça/yükseldikçe ölçeklendirme, dönüşte döndürme efektleri kullanılır. Mode 7'nin rotasyon ve ölçeklendirme yeteneklerinin en kapsamlı kullanımlarından biri.
Dünya haritasını Mode 7 ile döndürülerek ve ölçeklenerek gösterir — karakteriniz hareket ettikçe tüm dünya dönüyor gibi görünür. Airship (hava gemisi) sahneleri de Mode 7 ile üstten perspektif görünüm sağlar.
Mode 7 her ne kadar etkileyici olsa da önemli kısıtlamaları vardı: sadece tek bir arka plan katmanı Mode 7 efekti kullanabilir (diğer katmanlar devre dışı kalırdı). Sprite'lar Mode 7'den etkilenmez — dönüşüm sadece arka plana uygulanır. Ayrıca texture yakınlaştığında pikselleşme çok belirgin olurdu çünkü filtre yoktu (bilinear/trilinear yoktu). Yine de bu sınırlamalarla bile 2D donanımda 3D illüzyonu yaratmak büyük bir başarıydı.
Palet döngüsü (color cycling / palette rotation), erken dönem bilgisayar grafiğinin en zarif animasyon tekniklerinden biridir. Piksel verileri hiç değiştirilmeden, sadece renk paletindeki değerler kaydırılarak görüntüde hareket illüzyonu yaratılır. Bu teknik neredeyse sıfır işlem gücü ve sıfır ek bellek kullanır — çünkü değişen şey pikseller değil, renklerin kendisidir.
İndeksli renk (indexed color) sistemlerinde —ki Amiga, C64, VGA bilgisayarlar hep bunu kullanır — her piksel doğrudan RGB değeri tutmaz. Bunun yerine bir palet indeksi (0-255 arası bir sayı) tutar ve bu indeks renk paletinde karşılık gelen RGB değerine bakar. Palet döngüsü bu tabloyu manipüle eder:
Mark J. Ferrari, palet döngüsü tekniğinin en usta uygulayıcılarından biridir. LucasArts macera oyunları (Loom, The Secret of Monkey Island, Thimbleweed Park) ve kendi kişisel çalışmalarıyla tanınır. Ferrari'nin Deluxe Paint (DPaint) ile Amiga'da yaptığı çalışmalar, statik bir pikseli sanat yapıtına dönüştürmenin şaheser örnekleridir.
Su efekti için Ferrari 6-8 ardışık palet girişi kullanır: koyu mavi → orta mavi → açık mavi → beyaz (ışık yansıması). Bu girdiler döngüsel olarak kaydırıldığında, su yüzeyindeki ışık yansımaları kayıyor gibi görünür. Üstelik bunu birden fazla hızda yaparak — yüzeydeki dalgalar hızlı, derin sudaki tonlar yavaş — çok katmanlı bir su illüzyonu elde eder.
Ateş için kırmızı → turuncu → sarı → beyaz gradyanında palet döngüsü. Lavlar genellikle daha yavaş bir döngü ile koyu kırmızı → parlak turuncu arasında kaydırılır. Ferrari, aynı görüntüde farklı döngü hızları ve yönleri kullanarak birden fazla bağımsız hareket oluşturur.
Mücevherlerde 4-5 palet girişi beyaz bir "specular highlight" (yansıma parlıltısı) oluşturmak üzere döndürülür. Parlak nokta mücevherin yüzeyinde kayar gibi görünür. Aynı teknik metal yüzeylerdeki yansımalar için de kullanılır.
Ferrari'nin en etkileyici çalışmalarından biri: tüm palet yavaşça değiştirilir (döngü değil, gradyan geçiş). Gökyüzü mavisinden turuncu gün batımına, oradan gece lacivertine ve tekrar şafak gülüne — tüm görüntü canlı bir gündüz/gece döngüsü yaşar. Hiçbir piksel değişmez, sadece renkler.
Electronic Arts tarafından 1985'te Dan Silva tarafından yaratılan Deluxe Paint, Amiga platformunun en önemli grafik programıydı. DPaint, döngüsel renk aralıkları tanımlama özelliği ile palet döngüsü sanatını doğrudan destekliyordu. Ferrari, DPaint IV'ü ana aracı olarak kullanmıştır. DPaint, retro grafik topluluğu tarafından hâlâ saygıyla anılır — birçok retro-stil oyun ve piksel sanatı hâlâ DPaint'ten ilham alır.
Palet döngüsü tekniği, Unity ve Godot gibi modern oyun motorlarında shader olarak uygulanabilir: bir renk arama tablosu (LUT) oluşturup bunu zamana göre kaydırmak, temelde aynı tekniktir. Retro-stil oyunlarda (Shovel Knight, Celeste) palet swap efektleri aktif olarak kullanılır. Ayrıca gif animasyonları bile palet döngüsü prensibini kullanır — GIF formatı indeksli renk tabanlıdır!
Dithering, az sayıda renkle daha fazla renk/ton illüzyonu yaratma tekniğidir. Farklı renklerdeki pikseller belirli desenlerde (pattern) yan yana yerleştirilerek, insan gözünün bu pikselleri ortalama bir ton olarak algılaması sağlanır. Baskı tekniklerindeki halftone (yarım ton) ile aynı prensiptir — gazetelerdeki siyah-beyaz fotoğraflar da aslında farklı boyutlarda siyah noktalardan oluşarak gri ton illüzyonu yaratır.
Sega Genesis/Mega Drive (1988), rakibi SNES'e kıyasla daha sınırlı bir renk paletine sahipti:
| Özellik | Sega Genesis | SNES |
|---|---|---|
| Toplam palet | 512 renk (9-bit: 3-bit R, 3-bit G, 3-bit B) | 32.768 renk (15-bit: 5-bit per kanal) |
| Aynı anda ekranda | 61 renk (4 palet × 15 renk + 1 arka plan) | 256 renk |
| Avantaj | Daha hızlı CPU (Motorola 68000 @ 7.67 MHz) | Daha zengin renk, Mode 7, özel ses |
Genesis'in 512 renklik paleti, SNES'in 32.768'ine kıyasla oldukça kısıtlıydı. Bu fark özellikle gradyan geçişlerde (gökyüzü, su, gölgeler) belirginleşiyordu: SNES pürüzsüz tonlama yapabilirken, Genesis'te renk bantlaması (color banding) oluşuyordu. Sanatçıların çözümü: sistematik dithering.
Sabit bir eşik matrisi (genellikle 2×2, 4×4 veya 8×8) kullanılarak piksellerin hangi rengi alacağı belirlenir. Düzenli, tekrarlayan bir desen oluşturur. Oyunlarda en yaygın kullanılan tür — hafif ve öngörülebilir.
Bir pikselin "hatası" (istenen renk ile mevcut palet arasındaki fark) komşu piksellere dağıtılır. Daha doğal, düzensiz bir desen üretir ama hesaplama maliyeti yüksektir. Genellikle baskı ve fotoğraf dönüşümlerinde kullanılır, gerçek zamanlı oyunlarda nadirdir.
Dithering hâlâ çok yaygın: GIF formatı (256 renk sınırı), video sıkıştırma (bantlamayı gizleme), CSS/web gradyanları (düşük kalite ekranlarda), ve hatta oyun motorlarındaki post-processing (film grain, banding azaltma) dithering kullanır. Bir sonraki bölümde göreceğiniz pixel art çalışmalarında da dithering temel bir tekniktir!
NES bölümünde kısaca değindik; şimdi sprite flickering'in teknik detayını ve kültürel etkisini daha yakından inceleyelim. Bu konu, "bir hatanın nasıl bir özelliğe dönüştürülebileceğinin" ders kitabıdır.
NES PPU'su bir scanline'ı render ederken, sprite evaluation aşamasında o satırda hangi sprite'ların görünür olduğunu belirler. OAM'deki 64 sprite'dan o scanline ile kesişenleri bulur ve ilk 8'ini seçer. OAM sırasına göre (düşük index = yüksek öncelik) seçim yapılır. Eğer 8'den fazla sprite aynı satırdaysa, 9. ve sonrakiler o karede render edilmez.
PPU ayrıca sprite overflow flag (Status Register bit 5) set eder — ama bu flag donanım hatası nedeniyle tam güvenilir değildir (false positive/negative üretebilir).
Bazı oyunlar flickering'i bilinçli bir tasarım aracı olarak kullandı:
Bugün retro-stil oyunlar (Shovel Knight, Celeste, Undertale) bazen kasıtlı olarak sprite flickering efekti ekler — teknik bir gereklilik olmadığı halde. Bu, NES kuşağının nostaljik "hissini" yaratmak için yapılır. Kısıtlamanın zorunlu sonucu olan bir teknik artefakt, zamanla estetiğin doğal bir parçası haline gelmiştir.
Parallax scrolling (paralaks kaydırma), ekrandaki arka plan katmanlarını farklı hızlarda kaydırarak derinlik (depth) illüzyonu yaratma tekniğidir. Yakındaki nesneler hızlı, uzaktaki nesneler yavaş hareket eder — tıpkı gerçek hayatta bir arabadan dışarı baktığınızda yol kenarındaki ağaçların hızla geçerken uzaktaki dağların neredeyse yerinde durması gibi. Bu, hareket paralaksı (motion parallax) olarak bilinen bir derinlik algısı ipucudur.
Irem tarafından geliştirilen Moon Patrol, parallax scrolling kullanan ilk arcade oyunu olarak kabul edilir. Ay yüzeyinde ilerlenen bu side-scroller'da üç arka plan katmanı farklı hızlarda kayar: yakındaki tepeler hızlı, uzaktaki dağlar yavaş, yıldızlı gökyüzü çok yavaş. Bu basit teknik anında "dünya" hissini güçlendirdi.
Taito'nun Jungle Hunt'ı da aynı yıl parallax scrolling kullandı. Orman sahnelerinde ağaç katmanları farklı hızlarda kayarak ormanın derinliğini hissettirir. Moon Patrol ile birlikte parallax scrolling'in arcade dünyasında yayılmasını başlatan öncülerdir.
2D donanımda parallax scrolling birkaç yöntemle uygulanabilir:
| Yöntem | Mekanizma | Örnek Platform |
|---|---|---|
| Çoklu arka plan katmanı | Donanım birden fazla bağımsız kaydırılabilir arka plan katmanı destekliyorsa (SNES: 4'e kadar, Genesis: 2), her katman farklı hızda kaydırılır. | SNES, Genesis, GBA |
| Raster efektleri / Scanline tricks | Tek arka plan katmanı olan sistemlerde, her scanline'da scroll register'ı değiştirilerek farklı satırlar farklı hızlarda kayar. Donanım 1 katman desteklese bile yazılımla çok katmanlı parallax yapılabilir. | NES, C64, Game Boy |
| Sprite tabanlı | Arka plan katmanı olmayan veya yetersiz olan sistemlerde, yatay şeritler halinde sprite'lar kullanılır. | Atari 2600 (çok sınırlı), erken arcade |
| HDMA (Horizontal DMA) | SNES'e özel: H-Blank sırasında DMA ile register değerleri otomatik olarak her satır için tablo dan güncellenir. Yazılım döngüsü gerektirmez, CPU serbest kalır. | SNES |
Parallax scrolling, 1980'ler ve 1990'ların tüm 2D oyunlarında standart hale geldi: Sonic the Hedgehog (Genesis — 3-4 parallax katmanı), Donkey Kong Country (SNES — çok katmanlı, sahne sahneden değişen parallax), Street Fighter II (arka plan detayları), Metroid serisi ve sayısız platformer.
Parallax scrolling bugün web tasarımında da yaygındır — scroll yaparken arka plan resimlerinin farklı hızlarda kayması (CSS background-attachment: fixed veya scroll-linked JavaScript animasyonları). 2D oyunlarda (Hollow Knight, Celeste, Ori) parallax hâlâ aktif olarak kullanılır. CSS ve Canvas/WebGL tabanlı parallax efektleri, aslında 1982'deki Moon Patrol'un doğrudan mirasçısıdır.
Aşağıdaki tablo, bu sayfada ele aldığımız tüm platformları yan yana karşılaştırmaktadır. Bu tablo, her platformun güçlü ve zayıf yanlarını bir bakışta görmenizi sağlar:
| Atari 2600 | NES/Famicom | Commodore 64 | Game Boy | Sega Genesis | SNES | |
|---|---|---|---|---|---|---|
| Yıl | 1977 | 1983 | 1982 | 1989 | 1988 | 1990 |
| CPU | MOS 6507 @ 1.19 MHz | Ricoh 2A03 @ 1.79 MHz | MOS 6510 @ ~1 MHz | Sharp LR35902 @ 4.19 MHz | Motorola 68000 @ 7.67 MHz | Ricoh 5A22 @ 3.58 MHz |
| RAM | 128 byte | 2 KB | 64 KB | 8 KB | 64 KB | 128 KB |
| Video RAM | — | 2 KB | Paylaşımlı (16 KB video alanı) | 8 KB | 64 KB | 64 KB |
| Çözünürlük | 160×192 | 256×240 | 320×200 / 160×200 | 160×144 | 320×224 | 256×224 (512×448 interlaced) |
| Toplam palet | 128 renk | 54 renk | 16 renk | 4 ton (DMG) | 512 renk | 32.768 renk |
| Aynı anda ekranda | ~4-5 (scanline'a bağlı) | 25 renk | 16 renk | 4 ton | 61 renk | 256 renk |
| Sprite sayısı | 2 Player + 2 Missile + 1 Ball | 64 (8 per scanline) | 8 donanım sprite | 40 (10 per scanline) | 80 (20 per scanline) | 128 (32 per scanline) |
| Sprite boyutu | 8px genişlik (1x/2x/4x) | 8×8 veya 8×16 | 24×21 (hi-res) / 12×21 (mc) | 8×8 veya 8×16 | 8×8 ile 32×32 arası | 8×8 ile 64×64 arası |
| Arka plan katmanı | 1 Playfield (20-bit) | 1 (+ nametable scroll) | 1 (karakter/bitmap) | 1 BG + 1 Window | 2 scroll katmanı | 4'e kadar (mod bağlı) |
| Özel yetenek | — | Mapper çipleri | Raster interrupt, SID ses | Taşınabilirlik | Hızlı CPU, "Blast Processing" | Mode 7, HDMA, ses (SPC700) |
| Frame buffer | ❌ Yok! | Tile tabanlı | Bitmap veya Karakter | Tile tabanlı | Tile tabanlı | Tile tabanlı |
Atari 2600'ün 128 byte RAM'i ile SNES'in 128 KB RAM'ini karşılaştırın: 1000 kat fark. Ama aralarında sadece 13 yıl var! 1977'den 1990'a görkemli bir sıçrama. Şimdi SNES'in 128 KB'ını bugünkü bir bilgisayarın 16-64 GB RAM'iyle karşılaştırın: 125.000 - 500.000 kat daha fazla. Bu katlanarak büyüme, Moore Kanunu'nun (yaklaşık her 2 yılda transistor yoğunluğunun ikiye katlanması) doğrudan sonucudur.
David Murray tarafından yürütülen kanal (~1.3M abone), retro bilgisayar donanımı ve grafik teknolojilerine odaklanır.
Retro oyunların teknik altyapısını inanılmaz detayda açıklayan bir kanal.
Bu sayfada gördüğünüz her teknik — racing the beam, sprite flickering, dithering, palet döngüsü, parallax scrolling, tile tabanlı rendering — bir kısıtlamaya verilen yaratıcı bir yanıttır. Bu tekniklerin birçoğu sadece tarihsel değil; modern oyun geliştirmede, web grafiklerinde ve shader programlamada hâlâ aktif olarak kullanılıyor.
Bir sonraki derste (Bölüm 5: Pixel Art) bu tarihsel bilgileri pratiğe dökeceğiz: kendi 4 renkli Game Boy sprite'ınızı çizecek, dithering tekniklerini uygulayacak ve NES renk kısıtlamasıyla çalışacaksınız.