Bezier yüzeyleri nasıl ışınlanır?


18

Matematikte bu soruyu denedim ve şaşırtıcı bir şekilde, "denklemler çok kötü, sadece işlevi sayısal bir kök bulucuya besle" idi. Ama kendinizi benim gibi bir grafik adamı olarak görüyorsanız ve tasarım çalışması için Bezier eğrileriyle kapsamlı bir şekilde oynadıysanız, daha iyi yapılabileceğine inanmalıyım. Kajiya tarafından anlaşılacak arka plana sahip olmadığım (Sylvester Matrices), ancak matematikle ilgili tavsiyem olan yayınlanmış bir algoritma var. sayısal olarak. Benzer sonuç veren başka bir fikrim vardı .

Peki, Ray / Bezier-yüzey kesişimini cebirsel olarak çözmeyi ummak, böylece açıkça kodlamayı ve süper hızlı süper yumuşaklığa sahip olmayı ummak tam bir boru rüyası mı?

Bunu engellemek gerekirse, bu hesaplamayı yapmanın en hızlı yöntemi nedir? Özyinelemeli altbölüm için sıkı bir bağ (ve hedef) elde etmek için "kıvrımları bulabilir misin?" Sayısal bir kök bulucu (iç çekme) kullanmanız gerekiyorsa, hangi özelliklere ihtiyacı vardır ve hız için en iyi seçim var mı?

Orijinal düşüncem, üçgenler hakkındaki diğer matematik sorumun cevabında anlatılan Laplace genişlemesine benzer şekilde belirli bir yüzeye hazırlanmakla ilgiliydi . Ama ben de genel yöntemlerle ilgilenirim. Sadece Utah çaydanlık gibi sabit bir şekil kümesi düşünüyorum . Ancak animasyonlu karelerde geçici tutarlılık için optimizasyon yöntemleriyle çok ilgileniyorum.


Rasgele bir Bezier yüzeyine uygulayabileceğiniz genel bir yöntem mi arıyorsunuz yoksa belirli bir yüzey için hızlı bir metot hazırlamanın bir yolu mu arıyorsunuz? Yüzey şekliniz çalışma süresinden önce sabitlenecek mi?
trichoplax

1
Bezier yüzeylerini raytracing'den çok daha kolay ışınlayabileceğinizi unutmayın. Ayrıca raytrace veya raymarch tek değişkenli yüzeyleri diğer türlerden çok daha kolay yapabilirsiniz! blog.demofox.org/2015/07/28/rectangular-bezier-patches
Alan Wolfe

Yanıtlar:


14

Öncelikle, düşündüğünüzü düşündüğüm Kajiya yöntemi: Kajiya, Işın İzleme Parametrik Yamaları , SIGGRAPH 82. Teknik rapor sürümü daha bilgilendirici olabilir.

Bundan umduğum şey, imkansız olmadığı ve bazı cebirsel geometri ve karmaşık sayılarla ellerinizi kirletmemeniz durumunda kavramsal olarak zor olmamasıdır. Bununla birlikte, doğrudan yapmak saçma pahalıdır.

"Gerçek" ışın izleyicileri iki şeyin bir kombinasyonunu yapma eğilimindedir:

  • Sayısal bir kök bulucu için iyi bir "başlangıç ​​değeri" elde etmek için düzeltme ekine sınırlayıcı bir hiyerarşi (örneğin AABB'ler) yerleştirme. Bunu iyi yaparsanız, "kırışıklık" sorununu önleyebilirsiniz.
  • Yamayı DDG kabuklarına bağlamak ve ışınları çokgen örgüler gibi izlemek.

Bu son nokta, "süper yumuşaklık" gereksinimini öldürdüğü gibi geliyor, ancak ışın diferansiyelleri kullanıyorsanız o kadar da kötü değil . Mozaikleme seviyesini ışının "boyutuyla" eşleştirmek hatayı güzelce sınırlar. Ayrıca, doku koordinatları için muhtemelen diferansiyellere ihtiyacınız vardır, bu nedenle kavşak testinin doğruluğunu kontrol etmek için de kullanabilirsiniz.

Zamansal tutarlılığı kullanmak kötü bir fikir değildir, ancak tam olarak bunu nasıl yapacağınız sahne grafiği temsilinize bağlıdır. Işın tutarlılığına bakmak isteyebilirsiniz. Favori arama motorunuza ışın paketi izleme ve ışın yeniden sıralaması hakkında bilgi alın .


9

Ray / Bezier-yüzey kavşağını cebirsel olarak çözmeyi ummak tamamen bir boru rüyası mı?

Evet, bu bir rüya gibi. Bikubik Bezier yaması 18 derecelik bir cebirsel yüzeydir. Bu yüzeyle bir ışınla kesişmek için 18 derecelik bir polinomun köklerini bulmanız gerekir. Bu kökler için bir formül yoktur - bunları sayısal yöntemlerle bulmanız gerekir . Aslında, bize 4. derecenin ötesinde denklemlerin kökleri için hiçbir zaman formül bulunamayacağını söyleyen matematiksel sonuçlar ( Abel-Ruffini teoremi ) vardır. Matematik sadece formüllerin henüz bulunmadığını söylemez; asla bulunamayacaklarını söylüyor çünkü var olamazlar.

Eğri şekillerin analitik (cebirsel) ışın izlemesini gerçekten yapmak istiyorsanız, Steiner yamalarını kullanmayı deneyebilirsiniz . Bunlar derece 4'e sahiptir, bu nedenle ışın-yama kesişimi bir kuartiğin köklerini (yani derece 4 polinomunu) bularak hesaplanabilir . Kuartiklerin köklerini bulmak için formüller vardır, ancak oldukça kötüdürler ve formülleri güvenilir bir şekilde uygulayan kod yazmak şaşırtıcı derecede zordur.


5

Birkaç yıl önce kullandığım başka bir seçenek (yikes!), Arama alanını daraltmak için aralık aritmetiği kullanan Toth'un 1985'ten itibaren şemasını kullanmaktır . IIRC, sonunda Newton-Rhapson'a başvuracak, ancak yine de IIRC, iyi bir çözüme ulaşmak için nadiren bir veya iki adımdan fazlasına ihtiyaç duyduğunu düşünüyorum.

Bakmama rağmen (hızlı bir bakış dışında) Mitchell , aralık matematiği ile ışın izleme konusunda daha yeni çalışmalar yayınladı.

(Yalnızca Bezier yüzeyleri yapıyorsanız, sınır yöntemi ve türevleri almak için çiçeklenme gibi hileler kullanabileceğiniz için aralık yönteminin biraz "aşırı" olabileceğini eklemeliyim. örneğin bir eksen etrafında dönme, genelliği daha yararlıdır.)


1

Uyumluluk sorunları olması durumunda https://www.shadertoy.com/results?query=bezier yaşa göre sıralayın:

, ... ya bir 2d eğrisine mesafeyi döndüren ya da bir 3d yamayı izleyen birçok spline alt kümesinin birçok çözümünü gösterir. Yivler ve yamalar birçok şekilde gelir. heavensine basit, bezier basit, nurbs aşırı karmaşık olmak beind. Spline'a ne kadar çok kısıt eklerseniz, o kadar basitleşir. NURBS uzatma taşmasıdır; - Düzgün Olmayan Ağırlık ("NU"), daha simetrik kamalarla karşılaştırıldığında verimliliği azaltır - Ration-alessess (R) ayrıca, bölümlere ayırma (rasyonlama) ve yakın segmentlerle karıştırma için biraz karmaşıklık ekler (özyinelemeli olarak çözüldü).

bezier-patch-tracing kök çözme özelliğidir ve bununla birlikte hassasiyet bağlamsal önceliklendirme gelir; ikinci dereceden denklemi çözmek için. bu, üstel karmaşıklık ve hassas kayıp nedeniyle kübikten daha yüksek üsler üzerinde pratik değildir.

ray-marching == küre izleme, kök çözme için daha basit bir sezgisel yaklaşımdır; bu, çoğu spline yamasını oluşturmak için basit ve en etkili çözüm gibi görünmektedir.

Lagrange gösterimi izlemeyi / yürümeyi kolaylaştırır (L noktaları spline üzerinde iken ControlVector noktaları (aynı spline'ın) nadiren spline üzerindeyken)

İlk stat ve son türevlerinin == 0 olduğu bir heavensine-spline vakası. sürekliliği basitleştirir ve daha az diferansiyel (daha az çıkarma) içerir. Bir ağır yama, tek bir geçişte verimli bir şekilde izlenebilir: https://www.shadertoy.com/view/4djfW3 , diğer kübik (veya daha yüksek) yivler sezgisel küre izleme / ışın yürüyüşü yaklaşımını daha verimli hale getirir (ve " en küçük pozitif kökü tutmak için tüm kökleri analitik olarak hesaplamaya cesaret etmek yerine yeterince hassas ") (her bir kök için katlanarak hassas hatalar biriktirerek).


Bilgisayar grafiklerinde, splinelar ve yamalar 2006 yılına kadar neredeyse tamamen z fırçalama ile değiştirildi. Z-fırçalama, homojen koordinatlara sahip yer değiştirme haritaları kullanır, hatta bize küre ve lineagments birliği olan bir "tip" kullanarak (linezgmanların yarıçapı vardır) 0, kürelerin uzunluğu 0, birliği basit ve kullanışlıdır). Bir tablo için göreceli olarak düşük bellek maliyetinde büyük bir performans artışı için hassasiyette küçük bir kayıp için, bu bir gpu üzerinde kolayca dinamik hale gelir.


Boşver. tüm 3d yama çözümleri küre izleme ile yapılır.
ollj

yama daha basit olduğunda performansı ve hassasiyeti önemli ölçüde artırır. dikişsiz göklerin bir yama birkaç iterasyon sizi çok ileri alır bir noktaya:
ollj

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.