Neden z'ye bölmek için dördüncü bir koordinat gerekiyor?


12

Burada yanıtı okudum:

Grafik kartı bir vektörün dördüncü elemanı olarak son konum olarak ne yapar?

"Dördüncü bileşen perspektif projeksiyonunu takip etmek için bir hiledir. Perspektif projeksiyonu yaptığınızda, z: x '= x / z, y' = y / z'ye bölmek istiyorsunuz, ancak bu bir işlem değil x, y, z vektörü üzerinde çalışan 3x3'lük bir matris tarafından uygulanabilir. Bunu yapmak için standart haline gelen hile, dördüncü koordinat, w eklemek ve x, y, z'nin her zaman w'ye bölüneceğini bildirmektir. tüm dönüşümler uygulandıktan sonra ve rasterleştirmeden önce. "

ama neden 3x3'lük bir matris kullanarak z'ye bölemedik?

ile çarpamayız mı

1/z 0 0
0 1/z 0
0 0 1/z

almak [x/z y/z 1]

?


Zincirin herhangi bir yerinde çeviri içeren bir dönüşümü (veya dönüşümlerin bileşimini) ifade etmeye çalışın. Aw değeri olmadan, bunu tek bir matriste ifade edemezsiniz.
DMGregory

Çeviri bölümünü anlıyorum, ancak dördüncü bir koordinat eklemenin nasıl yardımcı olacağını ya da z'ye bölmek için bir hile olduğunu

Değerinde ne için tamamen söylediklerini yapabilirsiniz. X ve y'yi z'ye bölmek, uzak nesnelerin küçüldüğü projeksiyonla 3B koordinatlardan 2B ekran alanına dönüştürmek için geçerli bir yöntemdir. W, çeviri yapabilmek için dördüncü boyuta götüren homojen bir koordinattır.
Alan Wolfe

Yanıtlar:


14

Yalnızca bölmek Çünkü eğer [x, y, z]tarafından zAlacağınız [x/z, y/z, 1]ve gerçek değerini kaybetmiş zEğer yakın / uzak düzlem kırpma yapabilir veya bir Z-tampon doldurmak istiyorsanız aslında yararlıdır.

En zazından GPU hakkında bazı bilgileri tutmanın en iyi yolu bu nedenle 3 yerine 4 bileşen kullanmaktır. istemek.

Örneğin, bir perspektif projeksiyonu durumunda, ortaya çıkan 4 bileşenli vektör budur:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

Perspektif bölünmesinden sonra vektör:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

Ve c + d/zkısım bize Z tamponunu doldurmak için yeterli bilgi veriyor.


[X / z, y / z, z] elde ederek yalnızca X ve Y'yi Z'ye bölebilirsiniz. GPU vektör bölünmesi yapmak zorunda değildir , herhangi bir hesaplama yapmak için tasarlanmış olabilir.
user253751

3

Teknik olarak bunu yapabilirsiniz. Ama neden rahatsız oluyorsun? Bu finali zaldığınız zaman, aşağıdakilerden birini yapabilirsiniz:

  • açıkladığınız şekilde 3x3'lük bir matris oluşturun 9 * sizeof(float), alan baytını boşa harcayın, hesaplamak için döngüleri harcayın 1/z(bir bölüm) ve daha sonra son tepe noktanızı almak için dokuz çarpı ve altı ekleme yapın veya
  • modern boru hattının şu anda yaptığı gibi üç bölüm yapabilirsiniz

Bunlardan biri benim için çok daha uygun görünüyor ve bu birincisi değil. Matris için optimize edilmiş donanım katlanmış olsa bile, kesinlikle olduğu gibi, hala basit bir bölümden daha kavramsal olarak daha karmaşıktır.

Ayrıca, bir 3x3 matris bir çeviri kodlamak olamaz ve 4x4 matris böylece (ve dolayısıyla dördüncü wkoordinatı) boru hattında önceki kullanılmaktadır neyse . Bu, zaten orada oturmuş dördüncü bileşene sahip olduğunuz anlamına gelir, böylece yararlı bir değer taşımak ve bölümünüzü onunla yapmak için de kullanabilirsiniz.

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.