Herhangi bir giriş geometrisi olmadan bir geometri gölgelendiricide ilkel üretmenin bir yolu var mı?


17

Birkaç yıl önce , yürüyen küpleri kullanarak 3B prosedürel arazi oluşturmak için bu GPU Gemini OpenGL'de uygulamaya çalıştım . Makale, Yürüyen Küpleri maksimum verimlilik için bir geometri gölgelendiricisinde uygulamayı önermektedir. Bu, gölgelendiriciyi etki alanındaki her voksel için bir kez çalıştırmam gerektiği anlamına gelir ve o hücredeki tüm geometriyi oluşturur.

Tökezlediğim bir problem, geometrinin gölgelendiricisinin, aslında gölgelendiricinin dışında işlemek için hiçbir şeye sahip olmadan nasıl çalışacağıydı. Benim çözümüm (oldukça çirkin görünüyordu) her hücrede bir nokta oluşturmak, geometri gölgelendiricisi ile atmak ve bunun yerine üçgenlerimi yaymaktı. Asla uygun bir çözüm bulamadım ve bu geçici çözüm son kodda kaldı.

Öyleyse, OpenGL'ye herhangi bir giriş geometrisi olmadan geometri gölgelendiricisinden bir oluşturma geçişi başlatmasını söylemenin bir yolu var mı? Yoksa işleri yürütmek için GPU'ya her zaman kukla noktalar göndermem gerekecek mi?

Yanıtlar:


15

Hayır, bunu yapmanın bir yolu yok.

Bir geometri gölgelendirici çağırma bir giriş ilkel gerektirir ve 0 veya daha fazla çıkış ilkel üretir. İlkel bir girdi olmadan, gerçekten geometri gölgelendiricisini çağırmanın bir yolu yoktur . Tabii ki, her bir ilkel için geometri gölgelendiricisinin maksimum çıktı ilkel sayısının sınırlarını uzatabilirsiniz (şu anda pratik sınırları bilmiyorum, belki binlerce sırada olmalıdır). Yani her nokta için 1024 üçgen üretebilirsiniz, ancak her zaman bazı girdi ilkellerine sahip olmanız gerekir .

Ne gerek yok ancak geometrinin gerçek kavramıdır. Gerçekten makul bir yerde 3D noktaları oluşturmak zorunda değilsiniz, sadece bazı soyut indeks veya doku koordinatlarına veya nitelik olarak herhangi bir şeye sahip olabilirler ve anlamlı bir 3D pozisyonu olması gerekmez. Kimse köşelerinizin hangi niteliklerine sahip olduğunu belirlemez. Ve herhangi bir nitelik olmadan köşeleri bile oluşturabilirsiniz . Ancak , bu ilkellerin gerçek nitelikleri olmasa bile, geometri gölgelendiriciyi çağırmak için bazı ilkel öğeler oluşturmalısınız (daha sonra, geometri gölgelendiricisinde çıkış geometrinizi nasıl hesapladığınız farklı bir sorudur).

Ama aslında, her ızgara hücresi için bir nokta oluşturmak ve o hücre için yürüyen küpler üçgenleri oluşturmak, tam olarak düz bir yaklaşımdır. Tabii ki bu hücrenin içerdiği özellikler size kalmış, 3D konum, 3D dokuya bir texcoord olabilir, ama bunlar oluşturduğunuz ızgara hücreleridir. Tamamen anlamsal olarak konuşursanız, aslında bu noktaları "atmaz" ve daha sonra bunları üçgenlerle "değiştirirsiniz", her noktayı bir üçgen kümesine "dönüştürürsünüz". Geometri gölgelendiricisinin amacı tam olarak budur ve bu konuda "hileli" veya "uygunsuz" hiçbir şey yoktur. Kimse geometri gölgelendiricisinin "uygun" girdi olarak aynı çıktı ilkel tipini üretmesi gerektiğini söylüyor .


Voksel ızgarasını oluşturmanın büyük ölçüde girişsiz bir yolunu elde etmek için yapabileceğiniz şey (ve aslında istediğiniz şey bu olabilir) sadece bir dizi niteliksiz nokta çizmek olacaktır. Bu, herhangi bir öznitelik dizisine ihtiyacınız olmadığı ve yalnızca hepsini devre dışı bıraktığınız ve glDrawArraysihtiyacınız olan hücre sayısı ile bir basit çağırdığınız anlamına gelir . Daha sonra köşe gölgelendiricide veya geometri gölgelendiricide, giriş köşe kimliğinden (yani gl_VertexID, sahip olduğunuz tek bilgidir) küçük bir dizin büyüsü ile gerekli 3D ızgara hücre dizinini oluşturabilir ve ardından yürüyen küplerin geometrisini bir aramadan hesaplayabilirsiniz. 3B cilt dokusu (veya herhangi bir veri yapısı).

: Yani, geçmişe bakıldığında ben baştan ifademi relativate gerektiğini Sen herhangi bir giriş olmadan ilkeller üretemez ilkel , ancak herhangi bir giriş olmadan bunları üretebilir geometri .

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.