holodepth

Three.js · Görüntü sonrası · Pass chain

Pass zinciri: görsel bir bayrak yarışı

Bir görüntü çoğu zaman tek bir filtreyle doğmaz; ekrana ulaşmadan önce bir dizi duraktan geçer. Bu durakların her birine kısaca pass (geçiş) denir ve matematiksel olarak düşünüldüğünde her biri, önceki adımın ürettiği sonucu — çoğu zaman bir renk dokusu veya tampon — girdi alıp üzerine kendi işlevini uygulayarak çıktıyı bir sonraki halkaya devreden bir fonksiyondur. Bayrak yarışındaki kurpa gibi elden ele geçen şey ise burada bellekte dönen tamponlardır.

Bu metafor bilerek sıradışıdır: ekranda hâlâ 3B sahne varken, post-processing tarafında elinizdeki şey giderek «bir fotoğraf ve onun türevleri» haline gelir. Üç boyutlu geometri zincirin ilk metrelerinde sahnedeyken; son metrelerde yalnızca VRAM’de elden ele gezen tamponlar vardır — paslanmaz bir tepsi gibi sıcak görüntü bir anda düşmez; doğru hızda ve sırayla taşınır.

Bu sayfa zincirin «kim kimden sonra koşuyor?» sözleşmesini işler. Render pipeline · Post-processing ve Render target · EffectComposer bölümleri altyapıyı kurar; burada ise özellikle anatomi, ping–pong, sıra disiplini ve maliyet cetveli öne çıkar — böylece üç sayfa birbirinin tekrarı olmak yerine aynı hattın farklı yakınlaştırmaları halinde kalır.

Bir pass zincirinin anatomisi

Gerçek projede zincir, tasarım hedefine göre uzayıp kısalır; yine de zihinsel model olarak çoğu yapı şu A→B→C→D omurgasına yakın kalır: önce sahne karşılığı, sonra yardımcı tamponlar veya yumuşatma gibi ara matematik, ardından estetik katmanlar ve en sonda monitöre kilitleyen çıktı adımı. Önemli olan ezberlenmiş sabit bir sıra değil; «hangi bilgi hangi pasadan sonra anlamlı oluyor?» sorusuna tutarlı cevap verebilmektir.

A. Temel render geçişi (Render Pass)

Zincirin ilk halkası tipik olarak ham görüntüdür: seçilen kamera ile geometri, materyal ve ışıklar işlenir; henüz «sinema filtresi» yoktur — tabiri caizse sahne ham fotoğraf makinesi çıktısı gibidir. Çoğu sonraki geçiş için kritik ayrıntı, bu adımın yalnızca renk değil, gerektiğinde derinlik (ve bazen yüzey normali gibi ek kanallar) üretip üretmediğidir; yoksa ekran-içi gölgelenme veya kenar vurgusu bir süre sonra «boşlukta çalışıyormuş» gibi görünür.

B. Ara işlem geçişleri (Processing Passes)

Ham kare oluştuktan sonra sahne grafiği yerini çoğu zaman tam ekran matematiğe bırakır. Bu bölümde iki sık örnek var — ikisi de zorunlu değildir; ihtiyaca göre zincirden çıkar veya birleştirilir.

  • Normal / geometri tamponu geçişleri: Bazı zincirlerde derinlik ile birlikte yüzey normalleri — bazen deferred tarzı tamponlar veya özel bir ön geçişle — toplanır. Bunlar doğrudan «güzel görünsün» diye değil; genelde SSAO, kenar algılama veya seçici efektler için ham gerçeklik verisi olarak kullanılır.
  • Blur Pass: Bulanıklaştırma çoğu zaman iki ucuz geçişe bölünür: bir boyutta yatay, bir boyutta dikey (ayrılabilir filtre). Böylece kare başına maliyet, tek bir dev iki boyutlu çekirdek hayal etmekten çok daha kontrol edilebilir kalır — bloom ve çok sayıda parlamanın altında bu matematik gizlidir.

C. Efekt geçişleri (Enhancement Passes)

  • Bloom Pass: Parlak bölgeler ayrıştırılır, çok katmanlı bulanıklaştırma ile yayılmış bir ışı halesine dönüştürülür ve ana görüntüye genelde additive karıştırma ile geri eklenir. Ton eşiği yanlış seçilirse ya dünya sürekli sızar ya da efekt kaybolur; sıra yanlışsa ise parlama kenarları sonradan yeniden tırtıklanabilir (bkz. işlem sırası).
  • Color Correction Pass: Kontrast, doygunluk ve renk dengesi gibi küresel görünüm kararları burada toplanır. Bazı projede tonemap da bu aileye yakın durur; bu yüzden bloom ile tonemap’ın «kim kimi sıkıştırıyor?» ilişkisini sahneye göre netleştirmek gerekir.

D. Final geçiş (Final Output)

Zincirin sonunda görüntü kullanıcıya bağlanır; çoğu yapıda anti-aliasing ya tam burada ya da bir önceki adımın hemen arkasında yer alır — çünkü AA’nın görevi, raster grid’inin ürettiği merdivenleri son anda yumuşatmaktır. Hangi AA ailesinin seçildiği (bkz. Render target · geçiş örnekleri) hem kaliteyi hem kare bütçesini belirler.

Input–Output döngüsü ve tampon yönetimi

Donanım düzeyinde basit bir kural vardır: çoğu gerçek zamanlı senaryoda GPU, güvenli biçimde aynı dokuyu aynı anda hem okuyup hem yazamaz (read–modify conflict). Bu yüzden ara görüntüleri döngüye sokmak için iki yazma yüzeyi kullanılır — geleneksel adı ping–pong buffer.

  • Süreç: Örneğin A tamponu kaynak, B tamponu hedefken bir geçiş tamamlanır; bir sonraki geçişte roller tersine döner: okunan yüzey ile yazılan yüzey yer değiştirir.
  • Mantık: Bu «meşale el değiştirmesi», zincir bitene kadar devam eder; bazı efektler tek geçişte biter, bazıları ise doğası gereği çift sayıda tur ister — özellikle iki eksenli bulanıklaştırma veya çok aşamalı parlama.

Yukarıdaki «iki eksen» durumu, anatomi · ara işlem geçişleri başlığında anlatılan yatay–dikey blur bölünmesiyle aynı yüzeydedir; ping–pong olmadan aynı dokuya hem örnekleyip hem yazmak hem tanımsız davranış hem de artefakt riski taşır — bu yüzden ara tampon çifti pratikte standarttır.

Teknik ayrıntılar ve EffectComposer bağlamı için Render target · Efekt zinciri nasıl işler? bölümündeki ping–pong açıklaması ile birlikte okumak, iki sayfayı tamamlayıcı kılar.

Order of operations: sırayı değiştirmek sonucu değiştirir

Post-processing bir «toplama işlemi» değildir; sıra değiştikçe görsel sonuç da değişir — bazen dramatik, bazen tamamen hatalı biçimde. Bu yüzden profesyonel projede sıra belgesiz kalmamalıdır: bir tablo, bir diyagram veya kod içinde yorum satırı bile bazen ekip için tek doğru kaynak olur. «Hangi geçiş listede nerede duruyor?» sorusunun diyagram ve örnek sıraları için Pass sırası sayfasına geçebilirsiniz; burada özellikle sıranın neden sonucu kökten değiştirdiği özetlenir — iki sayfa birbirinin yerine geçmez, tamamlar.

  • Hata örneği — AA ve bloom: Bloom’un eklediği parlama dilimi henüz varsa ve hemen ardından yanlış yerde agresif bir kenar yumuşatma uygulanırsa, glow’un kenarı yeniden aliasing gösterebilir veya tuhaf bir «kesilmiş halo» üretebilir.
  • Yönlendirici doğru akış (çoğu sahne için): Sahneyi çiz → ekran-içi derinlik bilgisine dayanan efektleri mümkün olduğunca erken ve tutarlı derinlikle işle → parlama ve geniş halasyonları ekle → küresel renk / ton düzenlemesini kilitle → en sonda (veya tasarım gereği bir önceki adımda) AA ve monitöre çıkışı bağla.

Bu liste kesin kanun değildir; örneğin bazı HDR iş akışlarında tonemap ile bloom’un göreli sırası tartışmalıdır — fakat tartışma «sıra önemli değil» demek için değil, hangi tanımın doğru olduğu içindir.

Performans ve geçiş sayısı dengesi

Çoğu geçiş, sahneyi yeniden üçgen üçgen çizmekten çok, tam ekran düzlem üzerinden shader çalıştırmayı içerir. Bu görünüşte hafif dursa da çözünürlük büyüdükçe maliyet çarpanı çok hızlı artar.

  • Piksel maliyeti sezgisi: Örneğin 1920×1080 çözünürlük kabaca iki milyon piksel çevresindedir; her tam ekran geçiş bu alanın tamamında matematik çalıştırır. Beş geçiş demek, aynı makroyı birkaç kez yeniden hesaplamak — üstüne shader karmaşıklığı eklenir.
  • Holodepth için optimizasyon omurgası: Benzer işleri yapan ardışık geçişleri mümkün olduğunca tek bir özel fragment shader içinde birleştirmek (multi-pass yerine single-pass) çoğu zaman dramatik kazanım sağlar; bedeli shader bakımını zorlaştırabilir. Ayrıntılı tasarım tartışması için Render target · Performans bölümü ile çapraz okuma yapabilirsiniz.

Efekt türlerine göre göreli maliyet tablosu ve tasarım tartışması için Efekt performansı ile birlikte okumak, buradaki «kaç tam ekran turu?» sezgisini somutlaştırır.

Holodepth teknik notu

Zinciri tasarlarken üç soruyu yazılı tutun: (1) Bu geçiş hangi tamponu okuyor? (2) Çıktı hangi renk uzayında «doğru» sayılıyor? (3) Mobil ve masaüstünde geçiş sayısı hedefi nedir? Bu sorular cevapsız kalırsa ekip içinde «aynı sahne, farklı makinede farklı film» sendromu yaşanır — sıra ve tampon sözleşmesi, görsel kalite kadar iletişim kalitesidir.