2 puan yazan GN⁺ 2024-02-29 | 1 yorum | WhatsApp'ta paylaş
  • 3D grafiklerde alışkanlıkla kullanılan 4x4 matrisler yerine Euclidean PGA’yı glTF uyumlu bir forward renderer’a uçtan uca uygulamayı deneyen bir çalışma
  • Döndürme ve öteleme, 8 float’lık bir PGA motor ile ifade ediliyor; genel motor bileşimi, 4x4 matris çarpımındaki 64 çarpma ve 48 toplamaya kıyasla daha az işlemle, 48 çarpma ve 40 toplamayla yapılıyor
  • Nokta dönüşümü basitçe açıldığında matristen daha pahalı, ancak normalizasyon koşulundan yararlanan sandwich product ile 21 çarpma ve 18 toplamaya kadar düşürülebiliyor; yön ve baz yönü dönüşümleri daha da ucuz
  • Tangent space normal mapping’de normal ve tangent, tangentRotor ile değiştirilerek vertex verisi 12 float’tan 9 float’a indiriliyor; world-space dönüşüm maliyeti de matris yaklaşımına benzer şekilde 47 çarpma ve 38 toplama seviyesine getiriliyor
  • Gerçek glTF içerikleriyle uyum için yükleme sırasında matrisleri motor’a çevirmek ve uniform scale’i ayrı bir float olarak izlemek gerekiyor; non-uniform scale için sınırlı işleme veya 4x4 matrisli alternatif yol gerekli

PGA ile yapılmış matrissiz forward renderer

  • Proje Look, Ma, No Matrices; amacı matrissiz bir forward renderer gerçekleştirmek
  • 2019 SIGGRAPH’tan sonra Geometric Algebra, özellikle Euclidean PGA, grafik ve makine öğrenimi topluluklarında ilgi gördü; ancak geleneksel 3D grafiklerde çoğu zaman dual quaternion’ları PGA motor diye yeniden adlandırma seviyesinde kaldı
  • Bu uygulama, glTF uyumlu bir 3D engine’e PGA algebra entegre ederek, yalnızca cebirsel isimleri değiştirmekle kalmayıp grafik pipeline’ının birçok bölümünü PGA yaklaşımıyla yeniden kuruyor
  • Referans uygulama Khronos glTF viewer; en iyi performansa odaklı bir uygulamadan çok, matrisleri tavizsiz biçimde değiştirmeye yönelik bir deney niteliğinde
    • Sonuçta hybrid solution büyük olasılıkla daha iyi bir tercih olabilir

4x4 matrislerden şüphelenme nedenleri

  • 4x4 matrisler uzun süre grafik API’lerinde ve GPU fixed-function pipeline’larında merkezi rol oynadı; hâlâ tipik forward rendering’in temel aracı
  • Modern GPU’lar fixed-function pipeline’dan çok programlanabilir skaler işlemcilere yaklaştığı için matris merkezli gösterim şart değil
  • Gerçek 3D engine’lerde birçok matris yalnızca döndürme ve öteleme içeren ortogonal matrislerdir
  • PGA motor manifold’u, Euclidean motion’ın tamamını daha düşük hesaplama ve bellek maliyetiyle ifade eder; quaternion ve dual quaternion’ları da dönüşüm gerektirmeden kapsayabilir

PGA veri gösterimi ve temel işlemler

  • PGA algebra, e0~e3 dört baz vektöründen üretilir
    • e1, e2, e3 sırasıyla x=0, y=0, z=0 düzlemlerine karşılık gelir
    • Özel degenerate vector e0, sonsuzdaki düzlemi temsil eder
  • Shader’da GLSL yerleşik tipleri kullanılarak operator overloading olmadan toplama, çıkarma ve skaler çarpımdan yararlanılır
    • motor mat2x4
    • line mat2x3
    • point vec3
    • direction vec3
  • Genel PGA motor bileşimi geometric product ile yapılır
    • 4x4 matris çarpımı: 64 çarpma, 48 toplama
    • Genel motor bileşimi gp_mm: 48 çarpma, 40 toplama
  • Özel dönüşüm kombinasyonlarında daha ucuz işlemler mümkündür
    • gp_rr: 16 çarpma, 12 toplama
    • gp_tt: 0 çarpma, 3 toplama
    • gp_rt / gp_tr: 12 çarpma, 8 toplama
    • gp_rm / gp_mr: 32 çarpma, 24 toplama
    • gp_tm / gp_mt: 12 çarpma, 12 toplama

Nokta ve yön dönüşümü optimizasyonu

  • PGA’da bir noktayı p, motor M ile dönüştürmek için sandwich product M p M̃ kullanılır
  • Basit açılım 33 çarpma ve 29 toplama gerektirir; bu, matris-vektör çarpımının 16 çarpma ve 12 toplamasından fazladır
  • Normalize edilmiş motor’un M M̃ = 1 koşulunu sağladığı gerçeğinden yararlanıp ifade yeniden düzenlenirse nokta dönüşümü 21 çarpma ve 18 toplamaya indirilebilir
  • Yön, yani sonsuzdaki nokta, implied e123 katsayısı 0 olduğundan daha ucuzdur
    • Genel yön dönüşümü: 18 çarpma, 12 toplama
    • Basis direction dönüşümü, örneğin x ekseni dönüşümü için 6 çarpma ve 4 toplamaya kadar düşürülebilir
  • Bu basis direction optimizasyonu, sonraki tangent frame işlemlerinde matrisin her zaman en hızlı olduğu varsayımını sarsan dayanak haline gelir

Normalizasyon, karekök, exponential ve logarithm map’leri

  • PGA motor’un squared pseudonorm’u M M̃ = a + b e0123 biçiminde bir Study Number’dır
  • Normalizasyon basit bir vektör normalizasyonu değil, sonuç motor’un orthonormal transformation olmasını garanti eden bir prosedürdür
    • Genel motor normalizasyonu uygulama maliyeti: 21 çarpma, 5 toplama
    • Saf translation veya rotation durumlarında daha verimli sürümler kullanılabilir
  • İki nokta, iki çizgi veya iki düzlem a, b arasındaki rigid transformation M = sqrt(b / a) ile ifade edilir
    • Aynı türden iki öğe için geometric product ba, adan bye giden dönüşümün iki katına karşılık gelen bir motor üretir
    • sqrt M = normalize(1 + M) biçiminde hesaplanabilir
  • PGA motor’un logarithm’i scaled line’dır; scaled line ise exponentiation ile rotation motor oluşturabilir
  • Genel bir 4x4 matrisin exponential map’i sayısal olarak pahalıdır; ancak PGA motor manifold’unda verimli bir closed form mümkündür

Tersler ve motor factorization

  • Geometric Algebra, normalize edilmiş nesnelerin terslerini verimli biçimde hesaplayabilir
    • plane inverse: kendisi
    • line inverse: işaretin ters çevrilmesi
    • point inverse: işaretin ters çevrilmesi
    • motor inverse: reversion
  • Genel bivector Plücker condition’ı sağlamayıp tek bir line’ı temsil etmediğinde, ters Study Number inverse kullanılarak hesaplanır
  • Rendering uygulamasında iki tür factorization kullanılır
    • Euclidean factorization: motor’u origin etrafında rotation ardından translation olarak ayrıştırır
    • Invariant factorization: motor’u birbiriyle commuting eden translation ve rotation olarak ayrıştırır; 3D’de Mozzi-Chasles theorem olarak bilinen biçimdir
  • Tangent frame ile object-to-world motor’u birleştirirken, frame’in translation’a invariant özellikleri nedeniyle Euclidean factorization kullanışlıdır

glTF matrisleri ve scale işleme

  • Mevcut glTF içerikleriyle birlikte çalışabilmek için yükleme anında matrislerin PGA motor’a dönüştürülmesi gerekir
  • 4x4 orthogonal matrix, quaternion ile olan izomorfizminden yararlanılarak motor’a dönüştürülür
    • İçe aktarılan tüm matrix ve transformation’lar load time’da dönüştürülür
  • PGA motor rigid body transformation’larla ilgilendiği için scaling içermez
  • Uniform scaling, rotation ve translation’a invariant olduğundan her node için tek bir float olarak izlenir
    • Her öğenin total scale’i kendi scale’i ile parent scale’in çarpımı olarak hesaplanır
    • Vertex’e total scale load time’da veya vertex shader’ın ilk aşamasında uygulanır
    • Translation’a parent scale load time’da ve animation update sırasında uygulanır
  • Yaklaşık 400 rastgele glTF dosyası örneğinde scale animation bulunanların oranı %0,5’in altındaydı; fixed uniform scale ise oldukça yaygındı
  • Non-uniform scaling, rotation’a invariant olmadığı için daha zahmetlidir
    • Genel non-uniform scale işlemede 4x4 matrix alternatif yolu kaçınılmazdır
    • Örnek glTF’lerde non-uniform scale’in yalnızca leaf node’a uygulandığı durumlar bulundu; bu durumda animation key’leri etkilemeden diğer dönüşümlerden önce scale ayrı olarak uygulanır

Model-View-Projection yerine geçiş

  • Forward renderer, object space’teki mesh geometry’yi screen space’e dönüştürür ve her triangle’ın kapladığı pixel’leri belirler
  • Tipik pipeline’daki model, view, projection matrix’leri içinde model ve view PGA motor ile değiştirilir
    • Vertex position için sw_mp
    • Normal ve tangent yönleri için sw_md
  • Projection matrix genellikle yalnızca 5 non-zero entry içerdiğinden, PGA’ya zorla çevrilmez; doğrudan projection expression kullanılır
  • CPU tarafındaki scene graph hierarchy update, matrix composition yerine motor composition kullanarak işlem miktarını azaltır
  • GPU tarafındaki vertex dönüşümü yalnızca basit bir karşılaştırmada motor’u dezavantajlı gösterebilir; ancak tangent frame gösterimi değiştirildiğinde sonuç farklılaşır

Tangent space normal mapping optimizasyonu

  • Tipik tangent space normal-mapped mesh’in vertex shader’ı position, normal ve tangent’i dönüştürmek zorundadır
  • Normal, tangent ve bitangent bir orthonormal frame oluşturduğundan, PGA’da canonical basis frame’den istenen tangent frame’e giden tangentRotor ile ifade edilebilir
  • Bu yaklaşım vertex descriptor’ı küçültür
    • Mevcut: position 3 + normal 3 + tangent 4 + uv 2 = 12 floats
    • PGA yaklaşımı: position 3 + tangentRotor 4 + uv 2 = 9 floats
    • Vertex başına float sayısı %25 azalır
  • tangentRotor double cover’a sahiptir ve scalar coefficient’ın sign’ı classical handedness flag ile eşleştirilerek even/odd k-reflection ayrılır
    • signed zero’ya dayanır; vertex shader’da sign(1/tangentRotor.x) ile handedness çıkarılır
  • Position, normal ve tangent 4x4 matrix ile dönüştürülürse toplam 48 çarpma ve 36 toplama gerekir
  • PGA yaklaşımı tüm tangent frame’i tek seferde dönüştürüp ardından normal ve tangent’i çıkarır
    • Tangent frame bileşimi: 16 çarpma, 12 toplama
    • Normal/tangent çıkarımı: 9 çarpma, 8 toplama
    • Position dönüşümü: 21 çarpma, 18 toplama
    • Handedness çıkarımı için 1 çarpma
    • Toplam 47 çarpma, 38 toplama
  • Vertex dönüşüm maliyeti matris yaklaşımıyla neredeyse aynıdır; transform storage ise 32 float’tan 8 float’a düşer

Fragment shader ve baked texture kısıtları

  • Mevcut içeriği yükleyebilmek için fragment shader aşamasında yeniden TBN matrix gerekir
  • Baking tool, high-detail mesh’i low-detail mesh’e bake ederken vertex normal ve tangent’i triangle face üzerinde interpolate eder ve her fragment’ta orthogonal TBN matrix oluşturarak tangent space normal texture üretir
  • Basis vector interpolation, matris yaklaşımına özgü tipik hatayı oluşturur; bu hata texture’a zaten baked durumdadır
  • Bu yüzden bu uygulama tangentRotor’dan normal ve tangent vector’ü açıkça çıkarır
  • Baking tool’a kadar kontrol sağlanabiliyorsa tangentRotor doğrudan fragment shader’a geçirilip normalize edildikten sonra sampled normal dönüşümünde kullanılabilir
    • TBN matrix oluşturmaya gerek yoktur
    • Vertex shader’da normal/tangent çıkarımı gereksiz hale gelir
    • Bir varying parameter azaltılabilir
    • Fragment shader’daki expensive orthogonalization da ortadan kaldırılabilir

Motor skinning ve animation blending

  • PGA motor, dual quaternion ile izomorfik olduğundan skinning’e doğal olarak uygulanır
  • Inverse bind matrix motor’a dönüştürüldükten sonra, dual quaternion skinning ile aynı kalıpta bone motor blend edilir
  • Blend edilen transformation’ların shortest arc’ı izlemesi için işaretleri hizalanır ve sonuç transformation yeniden normalize edilir
  • Animation blending de aynı şekilde CPU’da PGA motor’ları doğrudan blend edip ardından normalize ederek yapılır

Matris yerine geçme deneyinin sonucu

  • glTF uyumlu bir forward renderer’da yalnızca PGA kullanarak matrisleri değiştiren bir uygulama mümkündür
  • Dönüşüm maliyetinin daha pahalı olacağı beklentisi, tangent frame gösterimi ve sandwich product optimizasyonu uygulandığında o kadar basit değildir
  • Tangent space normal mapping’in tipik durumunda PGA motor yaklaşımı, vertex shader maliyetini matris yöntemiyle neredeyse aynı tutarken vertex memory footprint’i ciddi biçimde azaltır
  • Aynı storage’a yaklaşık %33 daha fazla vertex sığdırabilen bellek iyileştirmesi özellikle büyüktür
  • Bu teknik, vertex shader maliyetini neredeyse artırmadan ve pipeline’ın geri kalanını değiştirmeden mevcut 3D engine’lere drop-in replacement olarak uygulanabilir

1 yorum

 
GN⁺ 2024-02-29
Hacker News yorumları
  • En sevdiğim matematik/grafik YouTube içerik üreticilerinden biri olan Freya Holmér, kısa süre önce geometri cebirine giriş için gerçekten çok iyi bir video hazırladı: https://www.youtube.com/watch?v=htYh-Tq7ZBI&ab_channel=Freya...
    3D grafiklerle, özellikle de spline/Bezier eğrileriyle ilgileniyorsanız, bu kişinin bütün videolarına bakmaya değer.
    Benim için lineer cebir hep zordu ama bu tür bir Clifford cebiri yaklaşımı çok daha sezgisel geliyor.

    • Gerçekten iyi bir sunumdu ve bana https://enkimute.github.io/ganja.js/'yi hatırlattı.
      Bu kütüphane, asıl yazının yazarı enkimute tarafından yapılmış; tek dosyalı, build gerektirmeyen bir script olmasına rağmen N boyutlu cebir ve render desteği sunan oldukça etkileyici bir kütüphane.
    • Bu yazının o kişiden bahsettiğini sanmıştım. Spline ve Bezier videolarını da keyifle izlemiştim; sunum, asla aceleye gelmiş hissettirmeden doğrudan özüne giriyor.
    • YouTube yorumlarında da şaşırtıcı derecede iyi ek açıklamalar ve sorular var.
      Örneğin çarpmanın değişmeli olmaması gibi Freya'nın biraz hızlı geçtiği ya da atladığı noktalar için epey iyi açıklamalar mevcut.
  • Geometri cebiri bir süre boyunca benim için tam bir muammaydı ama sonunda şöyle düşününce çözüldü: aslında sadece polinom çarpımı, ama çarpım sırasının önemli olduğu nicelikler var ve çarpım tablosu tuhaf. Mesela i*i = 1, i*j = -j*i.
    Çoğu giriş kaynağı, iki vektörün geometrik çarpımını (x1*i + y1*j) * (x2*i + y2*j) derin ve gizemli bir şey gibi sunuyor ama aslında birinci sınıf cebirde öğrendiğimiz FOIL açılımıyla aynı:
    (x1*i + y1*i)(x2*i+y2*j) = x1*x2*i*i + x1*y2*i*j + y1*x2*j*i + y1*y2*j*j = (x1*x2 + y1*y2) + (x1*y2 - y2*x1)*i*j
    İlk parantezdeki değer bildiğimiz iç çarpım; ikinci parantezdeki değer ise bildiğimiz dış çarpıma karşılık geliyor ama i*j diye yeni bir boyutun tabanında ifade ediliyor. Ve dış çarpımdan farklı olarak keyfi boyutlara genellenebiliyor; geometri cebirinde buna wedge product deniyor.
    Bunu anlayınca dönüş formülünü türetmek gibi şeyler de kolaylaşıyor, çünkü cebirde öğrendiğiniz teknikleri doğrudan geometri problemlerine uygulayabiliyorsunuz.

    • Başka bir yorumda paylaşılan https://youtu.be/htYh-Tq7ZBI?si=lOmsCL2DoqUCQgh1&t=1540 bağlantısında Freya, aksiyomları teke indirgeme fikrini harika anlatıyor.
      Bir vektörün kendisiyle çarpımını o vektörün uzunluğunun karesi olarak tanımlarsanız, geri kalan her şey basit polinom çarpımından çıkıyor. Oldukça zarif.
    • Bu açıklama ilginç bir karşıtlık gösteriyor. Birkaç gün önce biri, matematik derslerinin neden işlemlerin nasıl ve nedenini öğretmek yerine sadece formül verip hesap yaptırdığını sormuştu; burada ise işlemin neden doğru olduğundan çok ne yaptığına odaklanılıyor.
      “Nasıl çalışır?” ve “Neden çalışır?” matematik öğretmenlerinin denge kurması gereken iki soru ve tek bir derste ikisini de her zaman iyi cevaplamak zor.
    • İkinci terim dış çarpım değil, eksterior çarpım ya da bivector'dür. Dış çarpım yalnızca 3 boyutta çalışır, ama eksterior çarpım daha yüksek keyfi boyutlarda da mümkündür.
      3 boyutlu iki vektörün dış çarpımı, bu iki vektörün oluşturduğu düzleme dik başka bir vektördür. Buna karşılık eksterior çarpım, iki vektör arasındaki paralelkenarı tarayan bir 2-vektör, yani bir bivector'dür ve vektörlerin bulunduğu düzlemin üzerindedir. 3 boyutta dış çarpım vektörü bu bivector düzlemine diktir.
    • Matematikte öğrenmesi en uzun süren şeylerden biri, çoğu şeyin mümkün olan en basit şekilde tanımlandığı gerçeğidir.
      Özellikle bir vektör uzayı V üzerinde çift doğrusal bir çarpım m:V x V -> V tanımlamak, tam olarak yalnızca taban vektör çiftleri üzerinde m'yi belirlemekle aynıdır. Buna “tensor çarpımının evrensel özelliği” derseniz muhtemelen sadece “ha, tamam” denir.
  • Dönüş enterpolasyonu için geometri cebiri, kuaterniyonlar, hatta tüm matrisin enterpolasyonu gibi çeşitli yaklaşımlar olması ilginç: https://www.gamedev.net/tutorials/programming/math-and-physi...
    Ama kodu elde optimize ettikten sonra, nihai kod çoğu yaklaşımda neredeyse aynı hale geliyor. Fark, kuralları ve olasılıkları nasıl anladığınızda yatıyor.
    Bildiğim kadarıyla geometri cebiri en tutarlı ve en yetenekli yaklaşım gibi görünüyor. Yabancı geliyor ve ilk başta benimsemesi epey zor ama o eşiği aşanlar seviyor.
    Buna karşılık herkes kuaterniyon kullanıyor ama anlamadığından şikayet ediyor ve görselleştirmek için bir kitap gerektiğini söylüyor; mesela Andrew J. Hanson ve Steve Cunningham'ın 『Visualizing Quaternions』 kitabı gibi.

    • Matematikçi değilim ve işimde de geometriyi çok kullanmıyorum ama eğlencesine geometri cebiri öğreniyordum; daha önce kuaterniyonları da öğrenmeye çalışmıştım.
      Geometri cebiri eğlenceli, kuaterniyonlar ise değil. Geometri cebirini anladığımı hissediyorum ama kuaterniyonlarda dersleri ve alıştırmaları takip etsem bile tek emin olduğum şey anlamadığım olmuştu. Şimdi geometri cebirini biraz bildiğim için sonunda kuaterniyonları da bir ölçüde anlıyormuşum gibi geliyor.
    • Naive Lie Theory』 harika bir kitap ve ilk bölümde kuaterniyonları öğretiyor.
      https://www.goodreads.com/en/book/show/4419538
  • Bu konuyla ilgileniyorsanız Grassman/Clifford/geometri cebiri kavramlarını gözden geçiren iyi slaytlar var: http://www.terathon.com/gdc12_lengyel.pdf
    Bir başka iyi site de şu: https://mattferraro.dev/posts/geometric-algebra

  • Sudgy’nin harika “A swift introduction to projective geometric algebra” sunumunu da atlamamak gerek: https://www.youtube.com/watch?v=0i3ocLhbxJ4
    Ayrıca başlıca referans sitesi de https://bivector.net
    1000’den fazla profesör, araştırmacı ve meraklının bulunduğu bivector Discord’una da katılabilirsiniz: https://discord.gg/vGY6pPk

    • O sunumun yazarı Eric Lengyel, 『Foundations of Game Engine Development, Volume 1: Mathematics』 kitabını da yazdı; 4. bölüm de aynı konuyu ele alıyor
  • Açıkçası geometrik cebirde, neyi neyle çarptığınıza dikkat etmezseniz her tür karma öğenin ortaya çıkma biçimi pek hoşuma gitmedi
    n boyutlu bir uzay olan bir şey için en fazla 2^n terim gerekmesi de yönetmesi zor geliyordu
    Geometriyi, yani iç çarpımı daha iyi ele alabilmesi gerekirmiş gibi görünüyor ama sadece dış çarpım ile Hodge yıldız işleci ya da musical isomorphism kullanmamak için ikna edici bir açıklama görmedim
    Bivektör u^v’yi o düzlemdeki dönmeye e^(u^v)t dönüştüren o “sihir” de özünde musical isomorphism ile 2-form u^v’yi lineer bir özdönüşüme çevirip e^(u^v)t ifadesini bir matris üssü olarak anlamaktan ibaret
    Bir de sık verilen örnek, Maxwell denklemlerini tek bir denkleme indirgemesi; ama diferansiyel formlar kullanıldığında bunlar zaten farklı nedenlerle geçerli olan iki denkleme indirgenebiliyor, dolayısıyla bunu teke indirmenin faydasını anlayamadım

    • “n boyutlu bir uzay olan bir şey için en fazla 2^n terim gerekir” tasarrufu bazen göz yanılmasıdır
      Örneğin normal vektörler, konum vektörlerinden farklı dönüşür. İkisini aynı veri yapısıyla gösterebilirsiniz ama içinde hangi tür vektör olduğunu takip etmeniz ve kodun her yerine ikisini farklı işleyen özel durumlar koymanız gerekir
      Geometrik cebir bunu doğrudan ele alır; vektörler için (i,j,k) tabanını, diğer tür içinse (j*k, k*i, i*j) gibi ayrı bir tabanı kullanır
      Tek bir denklemin iki ya da dörtten iyi olması anlamında bu, daha yüksek boyutlu bir uzayın daha düşük boyutlu olana göre depolama açısından daha ekonomik olabildiğine dair güzel bir örnektir
      Elektrik alanı ile manyetik alan arasındaki fark da, vektör ile bivektörün farklı oluşuna epey benzer. Elektrik ve manyetik alanları ayrı denklemlerle özel durum olarak ele alabilirsiniz ya da tek bir yöntemle tutarlı biçimde işleyebilirsiniz
    • Asıl önemli kısım zaten karma öğelerdir
      w=1, x,y,z=0 olan bir kuaterniyon özdeşliktir; w=0, x=1 ya da w=0, x=y=0.7 gibi kuaterniyonlar ise yalnızca 180 derecelik dönmelere karşılık gelir
      Keyfi bir dönme istiyorsanız ikisinin birleşimi gerekir. Yani “bu doğru etrafında biraz 180 derece dönme ve biraz da 0 derece dönme/özdeşlik” karışımı. Skaler ile bivektörü birlikte taşımak tam olarak budur
      Dış çarpım ve iç çarpımla “dikkatli olup” karışımı önlemeye çalışıyorsanız, onu yanlış kullanıyorsunuz demektir. Başrolde geometrik çarpım vardır ve son derece güzel karışımlar üretir
    • Karışıklığın zaten var olduğuna katılıyorum. Geleneksel yaklaşım bu karışıklığı sadece halının altına süpürüyor
      Örneğin normalleri ele alıyorsanız, birbirinden oldukça farklı dönüşen en az iki n boyutlu uzayı takip etmeniz gerekir
      Noktaları, düzlemleri, doğruları, normalleri, ötelemeleri ve dönmeleri tek bir multivector tipi ve tutarlı kurallarla ifade etmek, bir kez anladıktan sonra oldukça ferahlatıcı. Ben de hâlâ öğreniyorum
  • Aşağıdaki animasyon enterpolasyonu gerçekten harika ama sayfanın geri kalanındaki modeller biraz daha az hareketli olsaymış diye düşündüm
    Matematik, minik amigo fili olmadan da yeterince zor

    • Bence tam tersi. O fil gibi teşvik olmasaydı sayfanın sonuna kadar gelemezdim
  • Yazar bunu görüyorsa, PGA kısaltmasını ilk geçtiğinde tanımlasa iyi olurmuş

    • Merak edenler için söyleyelim, PGA projective geometric algebra, yani projektif geometrik cebir demek
      Çalıştığınız uzayın taban vektörlerine bir sıfır-taban vektörü daha eklenir. Bu sayede orijinden geçmeyen geometrik nesneleri de cebir içinde ifade edebilirsiniz
    • Özellikle “Fast PGA” için FPGA yazılması oldukça kafa karıştırıcıydı
    • Düzelttim. mea maxima culpa
  • Bu tür algoritmalar GPU düşünülünce de verimli mi?
    GPU’ların matris işlemlerine iyi uyduğuna dair belirsiz bir izlenimim var; geometrik cebir formülasyonu kullanıldığında bu avantaj kaybolup pratikte öne geçememesi gibi bir durum olur mu diye merak ediyorum
    Pek bilgili bir tahmin değil; yanlışsam düzeltilmek isterim

    • GPU standardında matris-matris ve matris-vektör çarpımları var diye GPU şirketlerinin bunları mutlaka hızlandırdığını düşünmek çok yaygın bir yanlış anlamadır
      Gerçekte tüm shader core yapısı zaten SIMD olduğundan bunun zorunlu olarak böyle olması gerekmez. Bazı GPU’lar yapar, bazıları yapmaz
    • Programlarken iki şeyi bulmanız gerekir: hesaplamak istediğiniz nicelik nedir ve bunu hesaplamanın en verimli yolu nedir
      PGA anlaması hiç de hafif olmayan bir yük getirir ama ilk sorunu ele almak için çok iyi bir yöntemdir. Zaten genelde önce en basit ve uygulaması en kolay yöntemi denemek daha iyidir
      PGA ile ilk kısmı çözüp elde ettiğiniz uygulama, programın geri kalanını prototiplemek ve gerçek darboğazları bulmak için benchmark yapmak açısından yeterlidir. Neyse ki çoğu durumda ya en hızlı hesaplama yöntemi odur ya da darboğaz olmayacak kadar hızlıdır
      Darboğaz olsa bile çözmeye çalıştığınız problemi derinlemesine anlamanızı sağlar. Yeterince hızlanır umuduyla döngülerden cycle kazımaya başlamadan önce böyle bir anlayışa sahip olmak bence daha iyidir
    • Bu yazı tam olarak bunu anlatıyor. Özeti, genel olarak benzer seviyede olabildiği yönünde
  • Bu, ilerlemenin en ucunda yaşanan ince fark kavgaları gibi görünüyor
    3D iskelet animasyonunun GPU’da hâlâ 4x4 matrisler kullanıyor olması, Half-Life 1 döneminde CPU üzerinde bu iş için geliştirilen matematiğin hâlâ en önde olduğunu gösteriyor. 1998’den 2024’e 26 yıl
    1000 yıl sonra da 3D animasyon muhtemelen aynı olacaktır

  • Bu yazı benim kavrayış sınırımın ötesinde ama başlığı görünce basit bir 3D renderer yapmaya çalıştığım deney aklıma geldi
    Lineer cebir öğrenmeye birkaç kez başarısız biçimde uğraştıktan sonra, duşta 3D dönmenin aslında sadece üç tane 2D dönme olduğu ve bunu zaten bildiğim fikri geldi. Yaklaşık bir saat sonra perspektifi de olan tel-kafes bir 3D renderer yapmıştım
    Herkese en az bir kez denemesini tavsiye ederim