Temel bilgiler ile başlayalım.
Genellikle, aşağıdaki adımları boyunca yerel üçgen köşe dönüştürmek istiyorum: standart GL yılında local-space coords-> world-space coords -> view-space coords -> clip-space coords
, ilk 2 dönüşümler GL_MODELVIEW_MATRIX
yoluyla yapılır, 3 GL_PROJECTION_MATRIX
aracılığıyla yapılır
Bu model görünümü dönüştürmeleri, genellikle uygulamak istediğimiz birçok ilginç dönüşüm için (örneğin, çevir, ölçeklendirme ve döndürme),'daki köşeleri temsil ettiğimizde vektör matris çarpımı olarak ifade edilebilir.. Tipik olarak, V = (x, y, z)
köşesi bu sistemde (x, y, z, 1)
olarak temsil edilir.
Tamam. Çevirmeli bir V_local dönüştürmeyi çevirmek istediğimizi söyle, sonra bir çevirme, sonra bir çeviri. Her dönüşüm bir matris * olarak gösterilebilir, onlara T1, R1, T2 diyelim. Dönüşümü her bir köşe noktasına uygulamak istiyoruz: V_view = V_local * T1 * R1 * T2
.Matris çarpımı ilişkilendirici, bir kez ve tüm M = T1 * R1 * T2
için hesaplayabiliriz.
Böylelikle M'yi köşe programına geçmek ve V_view = V_local * M
'u hesaplamamız gerekir. Sonunda, tipik bir köşe çizgisi gölgelendirici, köşe konumunu tek bir matrisle çarpar. Bir matrisin, nesnenizi yerel alandan klip alanına nasıl taşıdığınızı hesaplamak için yapılan tüm çalışmalar.
Tamam ... Bir dizi önemli ayrıntıya göz attım.
İlk olarak, şimdiye kadar anlattığım şey, genellikle, yalnızca boşluk alanına değil, görünüm alanına yapmak istediğimiz dönüşümü gerçekten kapsamaktadır. Bununla birlikte donanım, köşe gölgelendiricinin çıkış pozisyonunun bu özel klip-boşlukta temsil edilmesini bekler. Kertenkele koordinatlarını anlamlı bir matematik olmadan açıklamak zordur, bu yüzden bunu dışarıda bırakacağım, ama önemli olan nokta, köşeleri o kli- nik boşluğa getiren dönüşümün genellikle aynı tipte matris çarpımı olarak ifade edilebilmesidir. Bu eski gluPerspective, glFrustum ve glOrtho'nun hesapladığı şeydir.
İkincisi, bu, köşe konumlarına uyguladığınız şeydir. Normalleri dönüştürme matematiği biraz farklıdır. Yani, normal dönüşümden sonra yüzeye dik almak istemeleridir (referans için, genel durumda model bakış ters-devrik ile bir çarpma gerektirir, ancak birçok durumda basitleştirilmiş olabilir) var
Üçüncüsü, köşe gölgelendiriciye asla 4-D koordinatlarını göndermezsiniz. Genelde 3 boyutlu olanları geçersiniz. OpenGL, bu 3 boyutlu koordinatları (veya 2-D, btw) 4-D'ye dönüştürür, böylece köşe gölgelendiricisi ekstra koordinatı eklemez. 1'i w
koordinatı olarak eklemek için her köşeyi genişletir.
Tüm bunları bir araya getirmek için, her nesne için, bu sihirli M matrislerini, nesneye uygulamak istediğiniz tüm dönüşümlere dayanarak hesaplamanız gerekir. Gölgenin içinde, her bir köşe konumunu bu matrisle çarpmanız ve bunu köşe gölgelendirici Konum çıkışına iletmeniz gerekir. Tipik bir koddur (bu eski terminolojiyi kullanıyor) fazla veya daha az:
mat4 MVP;
gl_Position=MVP * gl_Vertex;
* Gerçek matrisler özellikle bu işlevlerin her biri için adam sayfalarında, web üzerinde bulunabilir:, perspectivescale, rotate, translateortho
Bu çok thorogh cevabı için teşekkürler! Kaçırdığım bir detay, MVP matrisini (ör. Üniform hale getirerek) glDrawElements çağrıları arasında değiştirebildiğiniz ... Bu çok yaygın matrislerin spesifikasyonunu programcıya bırakmak için khronos'tan garip hareket. Umarım kısa bir süre içinde glu ya da benzerlerini bulurlar ... – Wonko
Bu, middleware'in ne için olduğu. GL3.2 hızlı kodlama için daha az anlamlıdır. Ancak önceki versiyonlar, gerçek uygulama için yanlış soyutlama seviyesiydi. Üstüne bir devlet yönetim çerçevesi gerekiyordu. Ayrıca, matrisleri saklamak istediğinizi varsayalım. Bu, sürücünün tüm matris yığınlarını tutması gerektiği anlamına gelir, sadece gerekli olan (sadece köşe noktası değil) _all_ shader'lara nasıl iletilir, ihtiyacınız olan lezzeti anlarsınız - M, MV, MVP, IT (MV), IT (M)). En kötü yanı ? Uygulama, bir kerede birçok matris işlemini çalıştırarak, matematiği verimli hale getirebilen tek kişidir. GL bunu verimli bir şekilde yapamaz. – Bahbar