3D motorumda etkin bir anahat, seçilen 3d karakterler için bir vurgu efekti veya ekranda manzara oluşturmak için çalışıyorum. Şablon arabelleği ile çalıştıktan ve tatmin edici olmayan bazı sonuçlar elde ettikten sonra (içbükey şekillerle ilgili sorunlar, kameradan uzaklığa bağlı anahat kalınlığı ve masaüstü ve dizüstü bilgisayarım arasındaki tutarsızlıklar), kenar algılama ve çerçeve tamponu örneklemesine geçtim ve bir anahat aldım oldukça memnun.
Ancak, seçilen ağ başka bir ağın arkasındayken anahattı gizleyemiyorum. Bu, benim sürecim göz önüne alındığında mantıklı, çünkü sahnenin geri kalanını oluşturduktan sonra bir çerçeve arabelleğinden 2d gölgelendirici anahat çiziyorum.
Sonuçlarımın iki ekran görüntüsü aşağıda. Birincisi, "iyi" bir çerçevedir, ikincisi, çerçevenin, anahat kaynağını engelleyen bir kafes üzerinde görüldüğü yerdir.
Oluşturma işlemi şu şekilde çalışır: 1) Vurgulanan kafesin alfa'sını çizin, bir çerçeve arabelleğinde (framebuffer1) siyah bir siluet yakalayın.
2) Dokuyu çerçeve tamponundan1 kenar algılamayı yapan ikinci bir gölgelendiriciye geçirin. Çerçevedeki kenar yakala 2.
3) Tüm sahneyi işleyin.
4) Sahnenin üstündeki framebuffer2'den doku oluşturun.
Nasıl yapılacağına dair birkaç fikrim var ve geçerlilikleri hakkında veya daha basit veya daha iyi yöntemlerle ilgili geri bildirim almayı umuyorum.
İlk olarak, tüm sahneyi bir çerçeve arabelleğine oluşturmayı ve vurgulanan ağın görünür siluetini alfa kanalında saklamayı düşündüm (tüm beyaz vurgulanan ağın görünür olduğu yerde saklanır). Daha sonra alfa kanalında kenar algılamayı gerçekleştirir, sahne çerçevesi arabelleğini oluşturur ve daha sonra kenarı üste getiririm. Bunun gibi bir şeyle sonuçlanır:
Bunu yapmak için, yalnızca herhangi bir görünür piksel için alfadaki tüm siyahı çizecek olan vurgulanan nesnenin render geçişi sırasında bir tanımlamayı ayarlamayı düşündüm.
İkinci fikrim, yukarıda özetlenen geçerli oluşturma işlemini kullanmak, ancak seçilen kafesin silueti oluşturulurken X, Y ve Z koordinatlarını framebuffer1'in R, G ve B kanallarında saklamaktır. Kenar saptamaları framebuffer2 içinde yapılacak ve saklanacak, ancak alfa kenarlarından silüete RGB / XYZ değerlerini ileteceğim. Sonra, sahneyi oluştururken, koordinatın framebuffer2 içinde saklanan kenar içinde olup olmadığını test ederdim. Eğer öyleyse, o zaman RGB parçasından (kamera boşluğuna dönüştürülmüş) çıkarılan koordinatların önünde mi arkasında mı olduğunu belirlemek için mevcut parçanın derinliğini test ederim. Eğer parça derinlik koordinatlarının önündeyse, parça normal şekilde oluşturulacaktır. Eğer parça arkasındaysa, düz anahat rengi olarak işlenir.
Bu proje için LibGDX kullanıyorum ve WebGL ve OpenGL ES'yi desteklemek istiyorum, bu nedenle geometri gölgelendiricileri veya daha yeni GLSL işlevlerini içeren çözümlerin hiçbiri benim için mevcut değil. Eğer biri önerilen yaklaşımlarım hakkında yorum yapabilir ya da daha iyi bir şey önerebilirse, bunu gerçekten takdir ediyorum.