Yoğunluk işlevine dayalı hacimsel verileri oluşturmak için grafik ardışık düzenini nasıl kullanabilirim?


12

Her iki grafik API'sı (OpenGL ve DirectX), birkaç aşamanın programlanabilir olduğu iyi tanımlanmış bir boru hattı oluşturur. Bu programlanabilir aşamalar, sabit bir minimum miktarda veri almayı gerektirir ve üzerinde iyi tanımlanmış bir işlem aralığı yapması ve bazı tanımlanmış minimum çıktıları çıkarması gerekir; böylece veriler bir sonraki aşamaya doğru şekilde aktarılabilir. Bu boru hatları, sadece D3D ve OGL durumunda köşe verileri ve doku koordinatları olan sınırlı sayıda geometrik veri türüyle çalışmak üzere tasarlanmış gibi görünüyor.

Ancak, yapmayı planladığım uygulamanın geometrik verilerini temsil etmek için köşeleri (hatta vokselleri) kullanmaması ve API'lerin bu tür sınırlamaları tam olarak dönüşüm veya projeksiyon veya rasterleştirme veya enterpolasyon veya böyle bir şey yapmaması durumunda veya boru hattı işleri zorlaştırır.

Öyleyse, grafik ardışık düzenini her aşamada verilere ve her aşamada çıkan veri türünün işlevselliğinin avantajım olarak değiştirilmesini sağlayacak şekilde değiştirebileceğimiz bir yol var mı? Değilse, kendi boru hattımı oluşturmak için 'raw' API işlevlerini kullanabileceğim bir yol var mı? Değilse, lütfen neden mümkün olmadığını belirtin.

EDIT : Uygulamam, geometriyi temsil etmek için yoğunluk işlevlerini kullanır. İşlev, uzayda her noktada bir değere sahiptir. Kameranın frustum'unu bir 3d ızgaraya bölerim, her blok bir piksel olarak yansıtılabilir. Her blokta yoğunluk fonksiyonunu entegre ederim ve değerinin gerekli bir değerden fazla olup olmadığını kontrol ederim. Eğer evet ise, o blokta bir şey olduğu ve o bloğa karşılık gelen pikselin oluşturulduğu varsayılır. böylece, şimdi benim oluşturucu, tepe tamponları vertex veri yerine (ben bir dize ile temsil) işlevi grafik donanım geçmek istiyorum. bu ayrıca tepe gölgelendiricisinin homojen klip alanına dönüşecek köşelere sahip olmayacağı ve parça gölgelendiricisinin piksel bilgisi almadığı anlamına gelir. bunun yerine, artık arama ve değerlendirmenin çoğu piksel başına gerçekleşir.


'Fonksiyon yoğunluk fonksiyonu' bir totoloji midir?
Pharap

@Pharap, bu bir yazım hatasıydı. onun sadece "desity functon" (uzayda "maddenin" varlığını temsil eder).
Light Spark

2
Sadece iyi incelenmiş bir problem olan bir izosurface inşa etmek istediğiniz gibi görünüyor. Gördünüz mü http.developer.nvidia.com/GPUGems3/gpugems3_ch07.html veya metaballs, nokta bulutu görselleştirme, isosurface çıkarma veya hacim render üzerinde arama? Ayrıca, ne tür bir performansa ihtiyacınız var, bu, hesaplamalarınızın karmaşıklığıyla birleştirildiğinde aradığınız teknik seçiminde büyük bir fark yaratacaktır. Kamera hareket ettiğinde piksel başına parıldamaya neden olacağını ve alt pikselin gerekli olacağını da düşünüyorum.
Patrick Hughes

Yanıtlar:


18

Hacimsel veri oluşturmak için GPU'yu kesinlikle kullanabilirsiniz.

Ekrandaki piksel başına bir dizi işlevi değerlendirmek istediğiniz için, basit bir yaklaşım tam ekran bir üçgen oluşturmaktır. Bu sadece tüm ekranı kaplayan tek bir üçgendir (aslında ekran üçgen olmadığından, ancak ekran dışındaki parçalar GPU tarafından atıldığından) ekrandan daha fazlasını kapsar. Daha sonra, bir hacim oluşturmak için bir ışın oluşturmak, işlevleri değerlendirmek için ne yaparsanız yapın piksel gölgelendiricisini (gölgelendirdiği pikselin ekran koordinatlarını alır) kullanabilirsiniz.

(Diğer yanıtların aksine, bir hesaplama gölgelendiricisini önermiyorum çünkü piksel başına işlemler yapmak istediğiniz gibi geliyor ve tam ekran üçgen + piksel gölgelendirici genellikle bir hesaplama gölgelendiricisinden daha verimli; hesaplama gölgeleyicileri de kesinlikle çalışacaktır.)

Tam ekran üçgen yöntemi, işlem sonrası işlemler için gerçek zamanlı grafiklerde çok yaygındır, bu nedenle muhtemelen ihtiyacınız olan tüm bilgileri biraz googling ile bulabilirsiniz.

BTW, tam ekran piksel gölgelendirici tekniği kullanılarak matematiksel işlevler (özellikle mesafe alanları) kullanılarak oluşturulmuş 3D sahnelerin nasıl oluşturulacağını anlatan bir konuşma olan Iñigo Quílez'in İki Üçgenli Rendering Worlds'ü okumanızı ilgilendirebilir .


Piksel gölgelendirici rasgele girişler (dizeler veya kullanıcı tanımlı diğer nesneler gibi) alır, böylece benim fonksiyonları geçebilir miyim?
Light Spark

GPU'larda rastgele işlev dizeleri üzerinde bir ayrıştırıcı ve / veya dil çalıştırmayı denemek isteyeceğinizden şüpheliyim, çünkü GPU'lar gerçekten genel bir amaç değildir. Büyük olasılıkla gölgelendiricinin kendisini ana kodunuzda dinamik olarak oluşturmak, ardından grafik sisteminin sonuçta elde edilen gölgelendiriciyi derlemesini ve çalıştırmasını istersiniz.
Patrick Hughes

@TheLightSpark Doğru, gölgelendiriciye dizeler geçiremezsiniz (gölgelendirme dillerinde dize türü bile yoktur), istediğiniz işlevler için gölgelendirici kodu oluşturmak ve derlemek istersiniz. Gerekirse bu çalışma zamanında yapılabilir.
Nathan Reed

Cevabınızı okumaya başladım, üçgen şeklinde bir monitör hayal ettim;) Pikselleri atmadan ekranı kaplayan iki yerine sadece tek bir üçgen kullanmanın bir avantajı var mı?
danijar

@danijar Evet, dörtlü kullanmaya göre hafif bir avantajı var, çünkü tam ekran dörtlü kullanırsanız diyagonal boyunca bazı pikseller iki kez gölgeli olacaktır. Öte yandan, rasterleştirici başlamak için bu pikselleri üretmeyeceğinden ekran dışı pikselleri silmek ücretsizdir.
Nathan Reed

6

Işın izleme ve diğer teknikler, Direct3D'nin D3D11 ve OpenGL'nin piyasaya sürülmesinden bu yana 4.3'ten beri desteklediği Compute Shader'larla (ve OpenCL ve bazı eğrilerin kullanılmasıyla daha uzun süre) yaygın olarak yapılır.


5

Bir GPU hesaplama gölgelendiricisi kullanmak veya boru hattını ihtiyaçlarınıza uyacak şekilde artırmak için bir "Gölgelendirici Depolama Arabelleği" nesnesi kullanmak istediğiniz gibi görünüyor. Matematikçiler, bilim adamları ve standart grafiklere tam olarak tercüme edilmeyen şeyleri hesaplamak için GPU'ya bakan diğer insanlar bu tür şeyleri kullanırlar.

Çağdaş grafik boru hattı çok esnek olmasına rağmen, geliştiriciler hala bazı kısıtlamalarla karşılaşma eğilimindedir. Ancak hesaplama gölgelendiricileri özelliği, tepe ve parça düşünmeye alışkın olduğumuz için boru hattı aşamalarını düşünmememizi kolaylaştırır. Artık belirli boru hattı aşamalarının giriş ve çıkışlarıyla kısıtlanmıyoruz. Örneğin Gölgelendirici Depolama Tamponu Nesnesi (SSBO) özelliği, hesaplama gölgelendiricileriyle birlikte tanıtıldı ve bu, boru hattı aşamaları arasında veri alışverişinin yanı sıra hesaplama gölgelendiricileri için esnek giriş ve çıkış olanağı sağlayan ek olanaklar sunar.

http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders

Bu sizi doğru yöne işaret etmiyorsa, tepe / parça paradigmasına uymayan konseptinizi genişletmeyi düşünür müsünüz?


Cevabımı, yaptığım şeyi içerecek şekilde düzenledim. compute shader cevaplar gibi görünüyor, ama sadece yapabileceğim başka bir şey olup olmadığını söyle.
Hafif Kıvılcım
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.