Kenar yumuşatma özelliğini OpenGL'de nasıl uygularım?


28

OpenGL'de tam ekran kenar yumuşatma yapmak istiyorum ve bir oyun oluşturduğum ve iyi efektler istediğim için OpenGL'in sağladığı kenar yumuşatma özelliğini kullanmak istemiyorum.

Nasıl ilerlemeliyim?


"GL'nin sağladığı kenar yumuşatması" ile, "zayıflama" olarak etiketlenmiş eski kötü adlandırılmış çizgi ve çokgen kalitesi ipuçlarına mı atıfta bulunuyorsunuz, yoksa düzenli olarak MSAA'yı GLX / WGL görselleriyle mi kullanıyorsunuz?
Lars Viklund

Yanıtlar:


28

OpenGL'de yerel MSAA'nın birkaç alternatifi var. İşlem sonrası etkilerle, bunlar hakkındaki en iyi şey, gölgelendiriciyi sadece son işlenmemiş görüntüye atabileceğiniz ve gerisini halledebilmenizdir. İşte görülmeye değer üç yöntem:

  • Hızlı Yaklaşık Anti-Aliasing (Geeks3D) - Çoğu durumda iyi. Uygulaması ve anlaması oldukça kolaydır. Dezavantajı keskindir, dokulardaki yüksek kontrast gürültüsü biraz bulanıklaşır. 1/4 piksel dik kadar ince olan kenarlar, geleneksel MSAA kadar keskin görünüyor. Bundan daha az dik, biraz doğruluk kaybeder.

  • Normal Filtrelenmiş Kenar Yumuşatma (GameDev ) - Bunu henüz doğru bir şekilde test etmedim, ancak bunu anlamak en kolay yoldur. En iyi durumlarda 16x MSAA'ya benzemektedir ve en kötü durumlarda 2x MSAA'ya benzemektedir. Kenarları ve göreceli açıları temsil etmek için geçici bir normal harita oluşturur. Normal haritayı luma farkı veya renk farkı ile örnekleyebilirsiniz.

  • Morfolojik Anti-Aliasing (Iryoku) - SMAA - Subpixel Mophological AA'ya iyileştirildi. 4 geçişte oldukça karmaşık, ancak gördüğüm en iyi sonucu elde ediyor. Kenarlarda 1/100 ila 1/200 piksel dik (!) Kadar kademeli gradyanlar oluşturur. Örnekleme luma bazlı, renk bazlı veya derinlik bazlı olabilir. Dokular çok net ve temiz kalıyor. (örnek DX10 ve HLSL tabanlıdır, doğru şekilde GLSL'ye taşınması biraz zaman alacaktır)

Bu teknikler süper örneklemeli veya çoklu örneklemeli değildir, bu nedenle kalınlığı 1 pikselden az görünen çizgiler boşluklarla görünecek ve kenar yumuşatma doğru olmayacaktır. Bu, MSAA olmayan bir yaklaşım kullanmanın olumsuz yanıdır. Yalnızca tam çözünürlükte bir raster görüntüyle çalıştığınız için, bu boş boşluklardan ek bilgi oluşturamazsınız.

Tüm bu tekniklerin bitişik luma (parlaklık) veya kroma (renk) değerlerinin örneklemeye bağlı olduğuna dikkat edin. Luma ve isteğe bağlı gama düzeltmesini hesaplamak AA gölgelendiricisinde ek talimatlar gerektirir, ancak bu oldukça basittir. Bunu, luma alfa kanalında saklayarak, rötuşlanmamış görüntü sağlayan önceki gölgelendiricideki lumayı hesaplayarak boşaltabilirsiniz. Sonra AA gölgelendiricisinde, alfayı basitçe örnekleyeceksiniz.


7

Antialiasing yapmanın birçok yolu vardır. Bunlardan biri, arka tamponunuzun gerçekte birden fazla alt piksel örneğini sakladığı ve üçgenler, çizgiler vb. İşler yaptığınızda, sistem otomatik olarak her pikseldeki doğru örnek kümesini doldurduğu çoklu örnekleme önleyici (MSAA) kullanmaktır. Ardından görüntü oluşturma sonunda, piksel başına bir örnek elde etmek için tüm alt piksel örneklerinin ortalaması alınarak görüntü "çözümlenir".

Başka bir yol, sahneyi normal yaptığınız sonra işlem sonrası antialiasing kullanmak ve sonra takma kenarları gizlemek için sonuçta bazı hedeflenmiş bulanıklaştırmalar yapmaktır. Bunun için çeşitli teknikler var, ancak şu anda en iyi / en popüler olanlardan biri FXAA (Hızlı yaklaşık Tutma Önleme) olarak adlandırılıyor.

MSAA genellikle işlem sonrası AA'dan daha iyi görünümlü sonuçlar verir, ancak daha yavaş olabilir, çünkü her işleme işlemi için yaklaşık olarak iki kat bant genişliği gerekir. MSAA ayrıca kurulumun ayrıntılarına bağlı olarak, işleme sonrası AA'dan daha fazla video belleği gerektirebilir.

Web’de MSAA veya FXAA’nın uygulanmasıyla ilgili özel bilgiler bulabilirsiniz - bu terimlerden herhangi birini google’da kullanın.


2

Kendi GLSL gölgelendiricinizi kodlamak ister misiniz? Eğer öyleyse, bu öğreticiyi kontrol edin .


ben de diğer efektler için shader kullanıyorum, çünkü shader kullanarak yapmak istiyorum. Shader'lar için başka linkler de verebilir misiniz
noddy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.