Birim seçim çevreleri nasıl birleştirilir?


16

Birleştirilmiş daire seçiminin bu etkisini nasıl yapacağımı bilmek istiyorum. İşte gösterilecek resimler:

resim açıklamasını buraya girin resim açıklamasını buraya girin

Temelde bu etkiyi arıyorum:

resim açıklamasını buraya girin

Dairelerin birleştirme etkisi nasıl elde edilebilir? Bu etki hakkında bir açıklama bulamadım. Bu dokuyu yansıtmak için bir çıkartma sistemi geliştirebileceğimi biliyorum, ancak birleştirme efektinin nasıl oluşturulacağını bilmiyorum.

Mümkünse, tamamen gölgelendirici çözümü arıyorum.


"Birleştirme efekti" ile ne demek istediğinizi açıklar mısınız?
wondra

Tabii ki, ekran görüntüsünün sağ üst karakterlerine bakarsanız, çıkartmalar birbirini geçmiyor, soldaki ikisi mavi dairelerini geçiyor ve birleştiriliyor. Efekti göstermek için yeni bir ekran görüntüsü ekledim.
MaT

Gölgelendirici çözümü konusunda ısrar ediyor musunuz? Değilse, son resminizde çözdünüz.
wondra

Son ekran görüntüsü yalnızca hedeflediğim etkiyi gösteriyor. Nihai sonuç, önceki ekran görüntüleri gibi görünmelidir.
MaT

1
Evet, katılıyorum, bence doku ile dinamik olarak bir örgü daire oluşturuyorlar ve sonra onları birleştirmek için ağı kesiyorlar. Aynı zamanda iyi bir çözüm, ancak yapabileceğiniz etki açısından daha sınırlı olduğunu düşünüyorum.
MaT

Yanıtlar:


8

Yapabileceğiniz birkaç püf noktası var:

Z-tampon

Diğer tüm nesneleri oluşturduktan sonra, her birim için maksimum Z değeri ile daha küçük boyutlu şeffaf bir daire oluşturun. Ardından seçim çemberlerini yere yapıştırın. Z sırayla aşağıda oldukları için, birimler altındayken atılırlar.

Tamamen şeffaf olması, dairenin sadece Z tamponuna yazılması anlamına gelir (maks Z değeri). Şimdi çıkartmaları oluşturduğunuzda, Z tampon değerlerine karşı test edilirler ve testi geçiyorlarsa renderlenirler (sadece dairelerin dışında olur)

şablon

Önceki yaklaşımla aynı, ancak bu sefer bir şablon tampon kullanın. Şablon değeri olan birimler için daha küçük daireler oluşturun, ardından seçim etiketlerini oluşturun. Şablonunuzu, şablon değerinizle tüm öğeleri silmek için ayarlayın.


Z-Buffer tekniği ilginç ama ilk saydam dairenin zemin etiketlerini nasıl kırpabileceğini anlamıyorum.
MaT

0

Örneğin, çıkartma oluşturma piksel gölgelendiricisini başka bir çıkartma ile kesişme olup olmadığını kontrol edebilir ve varsa pikseli öldürebilirsiniz. Bu tür dairesel etiketler için yapmak oldukça etkilidir.


1
Tüm çevrelerin konumlarını ve yarıçapları gölgelendiriciye geçirmek için cevabınızı bölümü atladığınızı varsayıyorum.
Kromster, Monica

@Krom OP çözüme herhangi bir ilgi duyduğunu ifade ederse, daha fazla ayrıntı vermekten memnuniyet duyarız.
JarkkoL

0

Yerdeki mavi daireleri mi kastediyorsun?

Bunu yapmanın daha akıllı bir yolu olabilir, ancak çözümümü bunun nasıl yapılabileceğinin bir örneği olarak düşünün. Çevrelerinizi, ekran boyutunda ayrı bir boş dokuya dönüştürün. Bu noktada bunları istediğiniz gibi karıştırabilirsiniz. İhtiyaçlarınıza bağlı olarak, tam rengi veya yalnızca belirli bir pikselde bir dairenin mevcut olduğu bilgileri yazabilirsiniz. Bununla birlikte, bir Z testi efekti istiyorsanız, yazdığınız her piksel için kesinlikle bir derinlik bilgisine ihtiyacınız olacaktır.

Önceki adımdan sonra araziyi oluşturduğunuzda, piksel gölgelendiricideki ekran koordinatlarını UV olarak kullanarak önceden oluşturulmuş dokuyu örnekleyebilirsiniz. Artık biliyorsunuz, dairenin arazinin belirli bir pikseline yansıtılması ya da yansıtılmaması gerekiyor. Ancak, bu şekilde Z testi devre dışı bırakılmış gibi çalışır, böylece bir arazi herhangi bir daireyi gizleyemez. Bir arazinin arkasındaki daireleri gizlemesini istiyorsanız, bir daireyi arazi dokusuyla karıştırmadan önce bir derinlik testi yapın. Arazinin biraz altında olan çevrelerin oluşturulmasını sağlamak için küçük bir önyargı kullanabilirsiniz, ancak yine de bunların oluşturulmasını istersiniz.


Düzenleme: Şimdi birleştirilmiş çevrelerin etkisini elde etmek için yapmanız gerekenler: Ayrı bir dokuya dönüştürürken, yeni bir tane oluşturmaya çalıştığınız yerde oluşturulmuş bir daire olup olmadığını kontrol etmeniz gerekir. (Dokunun orada bir değeri olup olmadığını kontrol edin) öyleyse, bu pikseli silin. Bu, iki veya daha fazla daire çakıştığında "anahat" etkisini vermelidir. Bunun doğru bir şekilde çalışması için, bu testi kenarlığın değil, yalnızca dairenin içi için yapmanız gerekir. Daireler oluştururken, çıkış dokusuna, içinde bir daire olduğunu belirten belirli bir değer yazın. O zaman sadece içerideki daireye hiçbir şey yapmamanız gerekir ve iyi olmalısınız.

Edit2: Basit kırmızı / yeşil örneğiniz için: Herhangi bir piksel oluşturmadan önce, bu pikselin yeşil olup olmadığını kontrol edin. Eğer öyleyse, render etmeyin. Bu hile yapacak. Aslında, dokuya yazarken dairenin dış / içi için kırmızı / yeşil bile kullanabilirsiniz ve daha sonra araziyi bu değerleri okurken ve istenen renge dönüştürebilirsiniz.

Cevabım herhangi bir şans eseri çok soyut ise, bana bildirin.


Genel fikri anlıyorum ama dediğin gibi, benim için birleştirilmiş dairelerle ilgili soyutlamak biraz :) :)
MaT

0

Birkaç seçenek var. Genel bir yöntem olarak, şablon arabellekleri, örneğin örnekte dairelerin üst üste geldiği anahat gibi, belirli çizimin maskelenmesi gereken yerlerde genellikle çok kullanışlıdır.

Bu durumda, bunun bir şablon tamponu olmadan kolayca yapılabileceğini düşünüyorum. Dairelerin çakıştığı anahatları ortadan kaldırmak için derinlik arabelleğini kullanabilirsiniz. Fikir, dairelerin iç kısmını sadece derinlik tamponuna çizmeniz (iç kısmı görmek istemediğimizden) ve ardından anahattı çizmenizdir. Bu şekilde, anahattın başka bir daireyle çakışan kısmı derinlik testi ile ortadan kaldırılacaktır.

Tek uyarı, derinlik savaşları konusunda dikkatli olmanız gerektiğidir. Ana hatların aslında iç mekanın arkasında olduğundan emin olmak ve derinlik testi ile ortadan kaldırmak için küçük bir ofset kullanabilirsiniz. Bir alternatif kullanmak olacaktır glPolygonOffset().

Diyelim ki xy düzlemine paralel iki merkeziniz var, merkezleri (x1, y1, z) ve (x2, y2, z). Ve şu çizim fonksiyonlarına sahipsiniz:

// Draw interior part of circle, shown in green in the schematic in the question.
drawInterior(x, y, z);

// Draw outline of circle, shown in red in the schematic in the question.
drawOutline(x, y, z);

Çizim sırası daha sonra deltaküçük bir ofset olmak üzere şöyle görünür :

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
drawInterior(x1, y1, z + delta);
drawInterior(x2, y2, z + delta);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
drawOutline(x1, y1, z);
drawOutline(x2, y2, z);

0

Başımın üstünden, eğer bu etiketler disk olarak çizilirse, her daireyi birbiriyle kesişim için test eder ve kesişim noktalarını bir diziye koyarım. Sonra bir kavşak içinde olmayan yaylar çizin. Yine de bu gölgelendirici bir çözüm değil.


Evet ben de düşündüm :) ama dediğin gibi bu gölgelendirici bir çözüm değil ve çok genel bir çözüm değil. Ama teşekkürler !
MaT

Bu oldukça belirsiz bir açıklama
Kromster,

0

Burada şablon oluşturmak istiyorsun. İlk geçişiniz daireleri şablon arabelleğine dönüştürür. İkinci geçiş , şablon arabelleğinin değişmediği her yerde görünür anahattı oluşturur . İkinci geçiş ilk geçişten daha büyük geometri kullanmalıdır, bu durumda basit bir doğrusal skaler yeterlidir.

Burada ana hatları çizmek için sahip olduğum çözüm ihtiyacınız olandan daha fazla olsa da (bu gölgelendirici her kafes kenarını tam bir dörtlü haline getirir), bu yaklaşımı izler: orijinal modeli şablon arabelleğine çizmek, ardından daha büyük bir sürüm oluşturmak şablon tamponu hala 0'dır.


Teşekkürler! Bu yüzden ilk önce görünür parçaları çizmek yerine şeffaf daireleri şablonun içine yerleştirmekle başlamalıyım. Ama yuvarlak saydam daireler çizebilirim? Görüntünün bir kısmının kalıba dönüştürülmesini sınırlayamıyorum. Şablona görüntü oluşturduğumda her şey oraya gidiyor, değil mi?
Doodlemeat

Evet, bu yüzden ikinci geçiş (görünür kısım) daha büyük ölçeklenir: bu nedenle sınırları şablon tamponundan daha büyüktür. Sadece ikinci geçişte bir tepe skaleri uygulamanız gerekir (anahat gölgelendiricileri arayın, çoğu bahsettiğim daha basit skaleri kullanır). Renk şeffafsa şablon arabelleğini de değiştiremezsiniz. Bu durumda muhtemelen ikinci bir doku maskesine ihtiyacınız olacak veya bunun yerine daireyi belirlemek için biraz mesafe matematiği yapabilirsiniz. Birkaç saat ve herhangi bir kod sağlamak için Unity erişim gerekir.
Draco18s artık SE

Hmm, ya ilk geçişte şablon arabelleğine yazmak için siyah / beyaz bir görüntüye sahip olun, böylece siyah 0 olur ve beyaz şablonda 1 olur. Bu mümkün mü?
16:48

İkinci bir doku maskesi ile kastediyorum. Eminim işe yarayacak, 24 saatten fazla sürmeyeceğim önümde Unity olmadan gerçekten doğrulayamıyorum.
Draco18s artık SE
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.