Postprocessing (Son İşlem)
Yalnızca birkaç son işlem efektiyle Breakout oyununun görsellerini tamamen canlandırabilsek harika olmaz mıydı? Bulanık bir sallama efekti, sahnenin tüm renklerini ters çevirme, çılgın vertex hareketleri ve daha fazlasını OpenGL'in framebuffer'ları sayesinde görece kolayca gerçekleştirebiliriz.
Bu bölüm, framebuffer'lar ve anti-aliasing bölümlerindeki kavramları yoğun şekilde kullanır.
Framebuffer'lar bölümünde, yalnızca tek bir doku kullanarak son işlem efektleri elde etmeyi göstermiştik. Breakout'ta benzer bir şey yapacağız: renk eki olarak çok örneklemeli (multisampled) bir renderbuffer nesnesi eklenmiş bir framebuffer nesnesi oluşturacağız. Oyunun tüm render kodu bu çok örneklemeli framebuffer'a render edilir; ardından içerik, renk tamponu olarak bir doku ekine sahip farklı bir framebuffer'a aktarılır (blit). Bu doku, sıfır veya daha fazla son işlem efekti uygulanmış tam ekran 2D quad'a render edeceğimiz oyunun kenar yumuşatmalı görüntüsünü içerir.
Özetlemek gerekirse render adımları şunlar:
Çok örneklemeli framebuffer'a bağlan.
Oyunu normal şekilde render et.
Çok örneklemeli framebuffer'ı, doku ekine sahip normal framebuffer'a aktar (blit).
Framebuffer'ı çöz (varsayılan framebuffer kullan).
Normal framebuffer'dan renk tamponu dokusunu son işlem shader'ında kullan.
Ekran boyutunda quad'ı son işlem shader'ının çıktısı olarak render et.
Efektler
Postprocessing shader'ı üç tür efekt destekliyor: shake, confuse ve chaos.
shake: Sahneyi küçük bir bulanıklıkla hafifçe sallar.
confuse: Sahnenin renklerini, aynı zamanda
xveyeksenini de ters çevirir.chaos: İlginç görseller oluşturmak için kenar tespit çekirdeğini kullanır ve ilginç bir kaotik efekt için dokulu görüntüyü dairesel şekilde hareket ettirir.

Vertex Shader
2D quad üzerinde çalışan vertex shader:
Hangi uniform true olarak ayarlandığına bağlı olarak vertex shader farklı yollar izler. chaos veya confuse true ise sahneyi hareket ettirmek için doku koordinatlarını değiştirir (ya doku koordinatlarını dairesel şekilde öteleme ya da tersine çevirme). Doku sarma yöntemini GL_REPEAT olarak ayarladığımızdan chaos efekti sahnenin quad'ın çeşitli parçalarında tekrar etmesine yol açar. shake true ise vertex konumlarını ekran sallanıyormuş gibi küçük miktarlarda hareket ettirir. chaos ve confuse'un aynı anda true olmaması gerektiğini, shake'in ise diğer efektlerin herhangi biriyle birlikte çalışabildiğini not edin.
Fragment Shader
Bu shader, framebuffer'lar bölümündeki fragment shader'ı üzerine inşa edilir ve aktif efekt türüne göre çeşitli son işlem efektleri uygular. Bu kez offset matrisi ve konvolüsyon çekirdekleri, OpenGL kodundan ayarladığımız uniform olarak tanımlanmıştır; avantajı bunları her fragment shader çalışmasında yeniden hesaplamak yerine yalnızca bir kez ayarlamamız. Örneğin offsets matrisi şu şekilde yapılandırılır:
PostProcessor Sınıfı
(Çok örneklemeli) framebuffer'ları yönetmeyle ilgili tüm kavramlar daha önceki bölümlerde kapsamlı şekilde ele alındığından burada ayrıntılara girmeyeceğiz. Aşağıda başlatmayı, framebuffer'lara yazma/okumayı ve ekran quad'ını render etmeyi yöneten bir PostProcessor sınıfının kodu bulunuyor:
Burada dikkat çeken kısım BeginRender ve EndRender fonksiyonları. Tüm oyun sahnesini framebuffer'a render etmemiz gerektiğinden, sahnenin render kodunun öncesi ve sonrasına uygun şekilde BeginRender() ve EndRender() çağırabiliriz. Sınıf, arka planda framebuffer işlemlerini halleder. Örneğin PostProcessor sınıfının oyunun Render fonksiyonunda kullanımı şöyledir:
İstediğimiz yerde son işlem sınıfının gerekli efekt özelliğini true olarak ayarlayabiliriz ve efekt hemen aktif hale gelir.
Shake It (Sallama)
Bu efektlerin (pratik) bir gösterimi olarak, topun sert bir beton bloğa çarptığındaki görsel etkiyi taklit edeceğiz. Sağlam bir çarpışma gerçekleştiğinde kısa bir süre için sallama efektini etkinleştirerek çarpışmanın daha güçlü bir etki bırakmış gibi görünmesini sağlayacağız.
Sallama efektini yalnızca kısa bir süre için etkinleştirmek istiyoruz. Bunu, sallama efektinin aktif kalması gereken süreyi yöneten ShakeTime adlı bir değişken oluşturarak gerçekleştirebiliriz. Sağlam bir çarpışma gerçekleştiğinde bu değişkeni belirli bir süreye sıfırlıyoruz:
Ardından oyunun Update fonksiyonunda ShakeTime değişkenini 0.0'a ulaşana kadar azaltıyoruz; ardından sallama efektini devre dışı bırakıyoruz:
Böylece her sağlam bloğa çarptığımızda ekran kısa süreliğine sallanmaya ve bulanmaya başlar; oyuncuya topun katı bir nesneyle çarpıştığına dair görsel geri bildirim verir.

Güncellenmiş oyun sınıfı kaynak kodunu buradan bulabilirsiniz.
Sonraki power-up'lar bölümünde diğer iki son işlem efektini de işe yarar biçimde kullanacağız.
Last updated