Rasterizasyon, üç boyutlu sahneleri hızlı ve verimli şekilde iki boyutlu görsellere dönüştüren temel grafik işlemidir. Modern oyunlarda yüksek performansın temelini oluşturur ve geometri, projeksiyon, shader işlemleriyle birleşerek gerçekçi kareler sunar. Ray Tracing gibi gelişmiş yöntemlerle birlikte kullanıldığında ise hem hız hem gerçekçilik sağlanır.
Rasterizasyon, bir ekran kartının üç boyutlu bir oyun veya uygulama sahnesini monitörde gördüğümüz sıradan iki boyutlu bir görsele dönüştürmesinin temel yollarından biridir. 3D dünya; modeller, yüzeyler ve milyonlarca üçgenden oluşurken, ekran yalnızca renkli piksellerden oluşan bir ızgara gösterebilir.
Görüntü oluşturma sırasında GPU nesnelerin kamera ile konumunu belirler, onları ekrana yansıtır, hangi pikselleri kapladıklarını hesaplar ve ardından materyaller, dokular, ışıklandırma ve diğer efektleri hesaba katarak renklerini belirler. Bu süreç sayesinde, sanal dünyanın matematiksel tanımı milisaniyeler içinde hazır bir kareye dönüşür.
Işın izleme ve Path Tracing gibi teknolojiler gelişse de, rasterizasyon hâlâ bilgisayar grafiğinin temelini oluşturur ve yüksek hız ile verimlilik sayesinde neredeyse tüm modern oyunlarda kullanılmaya devam eder.
Rasterizasyon, üç boyutlu bir sahnedeki geometrik nesnelerin ekran görüntüsünü oluşturacak parçalara dönüştürülmesi sürecidir. Basitçe söylemek gerekirse, ekran kartı sanal nesneleri (poligonlardan oluşan) alır ve ekranın hangi bölümlerini kaplayacaklarını belirler.
Oyunlardaki 3D modellerin büyük çoğunluğu çok sayıda üçgenden oluşur. Bir karakter, araba veya bina yuvarlak ve karmaşık görünse de, aslında yüzeyi çok sayıda küçük üçgenden oluşan bir ağdır.
Monitör ise üçgenleri veya üç boyutlu koordinatları doğrudan gösteremez; yalnızca iki boyutlu piksel ızgarası gösterebilir. Bu nedenle, ekran kartı her kareyi ekrana yansıtmadan önce, her üçgenin kamera ile göreli konumunu ve ekranın hangi bölümünü kaplayacağını hesaplamalıdır.
İşte bu noktada rasterizasyon başlar. Geometri iki boyutlu düzleme yansıtıldıktan sonra GPU, her üçgenin içinde hangi piksellerin yer aldığını belirler. Bu bölgelere fragmanlar denir - bu veriler, sonrasında renk, doku, ışıklandırma ve diğer görüntü parametrelerini hesaplamak için kullanılır.
Rasterizasyonu tüm görüntüleme süreciyle karıştırmamak önemlidir. Görüntü oluşturma (rendering) çok sayıda aşamadan oluşur: geometri işleme, shader'lar, derinlik kontrolü, ışıklandırma ve son kareyi oluşturma gibi. Rasterizasyon yalnızca bu adımlardan biridir, ancak üç boyutlu geometriyi ekranın iki boyutlu ızgarasına bağlayan kilit noktadır.
Oyunlarda rasterizasyonun başlıca kullanılma sebebi yüksek hızdır. Modern GPU'lar muazzam miktarda üçgen ve fragmanı aynı anda işleyebilir; bu sayede karmaşık bir sahne saniyede onlarca ya da yüzlerce kez görüntüye dönüştürülebilir.
Ekran kartı için bir oyun dünyası hazır bir görsel değil, bir veri kümesidir. Nesneler, üç boyutlu uzaydaki koordinatlara sahip köşe noktaları ile tanımlanır ve bu köşeler üçgenlerle birleştirilir. Ayrıca oyun motoru; materyal, doku, ışık kaynağı ve kamera konumu hakkında da bilgi gönderir.
Karmaşık bir karakter modeli bile on binlerce üçgenden oluşabilir. Üçgen sayısı arttıkça yüzeyin gerçekçiliği artar, ancak GPU'nun iş yükü de artar.
Rasterizasyondan önce ekran kartı, her köşenin kamera ile göreli konumunu belirlemelidir. Nesneler hareket edebilir, dönebilir ve ölçeklenebilir; dolayısıyla koordinatlar aşamalı olarak modelin yerel uzayından sahne uzayına, ardından sanal kameraya göre dönüştürülür.
Nesnelerin konumu belirlendikten sonra projeksiyon aşaması başlar. Bu, üç boyutlu koordinatları iki boyutlu ekran koordinatlarına çevirirken derinlik bilgisini de korur. Perspektif projeksiyon sayesinde uzaktaki nesneler küçük, yakındakiler büyük görünür; tıpkı gerçek hayatta veya bir kamerayla çekim yaparken olduğu gibi.
Ekran kartı, tüm geometriyi aynı şekilde işlemek zorunda değildir. Kameranın görüş alanı dışında kalan üçgenler elenir. Kare sınırındaki geometri ise yalnızca görünür alan için işlenir.
Ek olarak, GPU ve oyun motorları görünmeyen yüzeyler için gereksiz işlem yapmaktan kaçınır. Örneğin, kapalı bir nesnenin arka yüzeyi daha piksel hesaplanmadan hariç tutulabilir.
Tüm bu adımların ardından, kalan her üçgenin iki boyutlu düzlemde belirli bir konumu olur. Artık ekran kartı doğrudan rasterizasyona geçip, üçgenin hangi ekran bölgelerini kapladığını belirler.
GPU'nun paralel mimarisi, bu tür işlemlerin çok sayıda köşe noktası ve diğer grafik verisi üzerinde eşzamanlı yapılmasına olanak tanır. NVIDIA ekran kartlarındaki CUDA çekirdekleri ve GPU performansı hakkında daha fazla bilgi almak isterseniz aşağıdaki makaleye göz atabilirsiniz:
NVIDIA GPU'larda CUDA çekirdekleri nedir ve performansı nasıl etkiler?
Üçgen, her zaman tek bir düzlem oluşturan en küçük geometrik şekildir. Üç köşe noktası, aralarındaki yüzeyin belirsiz olmasına asla izin vermez; bu nedenle GPU'lar için üçgenlerle çalışmak hızlı ve pratiktir.
Hemen her karmaşık şekil üçgenlere bölünebilir. Bir küre, araba gövdesi, karakter yüzü veya devasa bir oyun haritası ekran kartı için basit üçgenler topluluğuna indirgenir.
Üçgen ekran üzerine yansıtıldıktan sonra asıl rasterizasyon başlar. GPU, ekran ızgarasında hangi noktaların üçgenin içinde olduğunu belirler. Buna göre fragmanlar oluşturulur - bunlar gelecekteki piksellerin adaylarıdır.
Ancak ekran kartı için, bir noktanın üçgene ait olup olmadığını bilmek yeterli değildir. Aynı zamanda yüzeyin o noktadaki derinliği, doku koordinatları, yüzey normali ve diğer bilgileri de hesaplamalıdır.
Bu değerler köşe noktaları arasında enterpole edilir. Örneğin, üçgenin her köşesine farklı doku koordinatları atanmışsa, GPU aradaki tüm fragmanlar için bu koordinatları otomatik olarak hesaplar. Böylece tek bir doku, modelin yüzeyine pürüzsüzce sarılabilir; her piksel için ayrı bilgi verilmesine gerek kalmaz.
Rasterizasyondan sonra elde edilen fragmanlar, daha fazla işlenmek üzere shader'lara gönderilir. Genellikle burada piksel (fragman) shader'ı devreye girer - bu küçük program, yüzeyin görünümünü tanımlar.
Shader; doku rengini okuyabilir, materyal özellikleri, ışık yönü, yüzey normali, yansımalar ve daha pek çok parametreyi dikkate alabilir. Sonuçta her fragman için nihai renk belirlenir.
Süreç, yalnızca dokudan renk okumaktan çok daha karmaşık olabilir. Modern oyunlarda normal haritaları, fiziksel olarak doğru malzemeler, çoklu ışık kaynakları, gölgeler ve sonradan işleme efektleri kullanılır. Ancak temel prensip aynıdır: rasterizasyon, ekran üzerindeki geometriyi belirlerken, shader'lar onun nasıl görüneceğine karar verir.
Shader'ların neden oyun başlamadan önce derlendiği ve bunun ne işe yaradığı hakkında daha fazla bilgi için aşağıdaki yazıya göz atabilirsiniz:
Shader derleme nedir? Oyunlarda takılma ve performansın sırları
Rasterizasyon, daha büyük bir sürecin yalnızca bir aşamasıdır; bu süreç grafik boru hattı olarak adlandırılır. Tek bir kare oluşturulurken, veriler sırasıyla birkaç aşamadan geçer: üç boyutlu geometri işlenmesinden, son renklerin görüntü arabelleğine yazılmasına kadar.
Önce oyun motoru ekran kartına sahne bilgilerini iletir: nesnelerin geometrisi, dokular, materyal parametreleri, kamera konumu ve diğer veriler. Ardından GPU, modellerin köşelerini işler ve bunları nesnelerin ve gözlemcinin konumuna göre dönüştürür.
Bir sonraki aşamada primitiflerin birleştirilmesi gerçekleşir. Köşe noktaları üçgenlere dönüştürülür, ardından geometri filtrelenir. Örneğin, bir üçgen tamamen görünür alan dışında kalıyorsa, işlenmesine gerek yoktur.
Kalan geometri rasterizatöre gönderilir. Rasterizatör, her üçgenin ekranın hangi bölümünü kapladığını belirler ve ilgili alanlar için fragmanlar oluşturur. Daha sonra, fragman shader'ları bu parçaların dokular, materyaller ve ışıklandırma ile nasıl görüneceğini hesaplar.
Bir fragmanın var olması, mutlaka son karede görüneceği anlamına gelmez. Birden fazla nesne aynı ekran bölgesine yansıtılabilir. Hangi yüzeyin kameraya daha yakın olduğunu belirlemek için derinlik arabelleği (Z-buffer) kullanılır. Eğer bir nesnenin önünde başka bir yüzey varsa, gizli fragman gösterilmez.
Tüm kontrollerden sonra hesaplanan renk, kare arabelleğine yazılır. Bu arabellekten alınan veri monitöre gönderilir ve gördüğümüz görüntüyü oluşturur.
Modern grafik API'lerinde geliştiriciler, GPU'nun çalışma düzeni ve grafik komutlarının iletimi üzerinde oldukça düşük seviyede kontrole sahiptir. Bu konuda daha fazla bilgi için aşağıdaki makaleyi ziyaret edebilirsiniz:
Vulkan ve DirectX 12: Oyunlar ve uygulamalar için grafik API'lerinin karşılaştırılması
Tüm bu süreç, her kare için baştan tekrarlanır. 60 FPS'de ekran kartı bu ana grafik aşamalarını saniyede yaklaşık 60 kez, 144 FPS'de ise 144 kez uygular. Bu nedenle, geometri işleme, rasterizasyon ve shader hızları doğrudan oyun performansını belirler.
Rasterizasyon ve ışın izleme (Ray Tracing) aynı temel amaca hizmet eder - üç boyutlu bir sahnenin görüntüsünü oluşturmak - ancak bunu tamamen farklı yöntemlerle yaparlar. Rasterizasyonda ekran kartı, geometri ile başlar ve her üçgenin ekranın hangi bölümünü kapladığını belirler.
Ray Tracing ise farklı çalışır. Geometriyi doğrudan ekran fragmanlarına dönüştürmek yerine, algoritma sanal sahnedeki ışınların hareketini simüle eder. Işınlar nesnelerle kesişebilir, yüzeylerden yansıyabilir veya gölge ve aydınlatma hesaplarında kullanılabilir.
Bu yaklaşım, birçok optik etkinin doğal şekilde hesaplanmasına olanak tanır. Örneğin, yansımalar gerçekten çevredeki nesneleri hesaba katabilir, gölgeler ise ışık kaynağı ve sahne geometrisine göre şekillenir. Klasik rasterizasyonda benzer sonuçlara ulaşmak için genellikle ek teknikler ve önceden hazırlanmış veriler gerekir.
Rasterizasyonun en büyük avantajı performanstır. GPU'lar onlarca yıldır büyük miktarda üçgeni hızlıca işleyebilecek şekilde optimize edildi ve grafik boru hattının birçok aşaması paralel yürütülüyor. Böylece ekran kartı, karmaşık sahnelerde bile yüksek kare hızlarında görüntü oluşturabilir.
Işın izleme ise çok daha fazla işlem gücü ister; çünkü ışınların geometriyle etkileşimleri sürekli analiz edilmelidir. Bu nedenle, modern oyunlarda tamamen rasterizasyondan vazgeçilmesi nadir görülür. Bunun yerine geliştiriciler genellikle hibrit render yöntemini tercih eder.
Ana sahne rasterizasyonla oluşturulur, Ray Tracing ise yalnızca görüntüyü belirgin şekilde iyileştiren yansımalar, gölgeler veya küresel aydınlatma gibi alanlarda kullanılır. Böylece klasik render'ın yüksek performansı, daha gerçekçi ışık efektleriyle birleşir.
Daha da karmaşık olan Path Tracing tekniğinde ise ışığın davranışı çok daha kapsamlı şekilde simüle edilir. Bu teknoloji hakkında daha fazla bilgi için aşağıdaki yazıyı inceleyebilirsiniz:
Path Tracing ve Ray Tracing Arasındaki Farklar: Oyunlarda yeni nesil grafikler
Rasterizasyon, üç boyutlu bir sahneyi görsele dönüştüren ardışık bir geometri işleme sürecidir. Ekran kartı köşe noktalarını ve üçgenleri alır, bunları kameraya göre dönüştürür, ekrana yansıtır ve her nesnenin gelecekteki karenin hangi bölümünü kaplayacağını belirler. Ardından shader'lar yüzeylerin görünümünü hesaplar, derinlik kontrolleri ise yalnızca görünen fragmanları son karede bırakır.
Rasterizasyonun en büyük gücü hızı ve verimliliğidir. Modern GPU'lar, devasa miktarda geometriyi paralel olarak işleyip bu süreci saniyede onlarca, hatta yüzlerce kez tekrar edebilir. Bu nedenle, daha karmaşık yöntemler çıksa da, rasterizasyon çoğu oyunun grafik temelini oluşturmaya devam ediyor.
Ray Tracing ve Path Tracing grafik olanaklarını genişletip ışığı daha gerçekçi şekilde modelleyebilse de, çok daha fazla işlem gücü gerektirir. Bu yüzden pratikte en verimli yol, teknolojileri birleştirmektir: ana sahne rasterizasyonla hızlıca oluşturulur, ışın izleme ise daha gerçekçi gölge, yansıma ve aydınlatma gereken alanlarda devreye girer.