2009-10-28 16 views
16

Ben OpenGL 2 uygulama yazmaya deneyim biraz var ve bu ben sabit bir itirazın descirbe Addison Wesley "Kırmızı-kitap" ve "Turuncu-kitap" (GLSL) aldım OpenGL 3. kullanarak öğrenmek isteyen işlevsellik ve yeni programlanabilir boru hattı (shader). Ama kavramayacağım şey, kullanımdan kaldırılmış çeviri *, döndürme * ve ölçek * işlevlerini kullanmadan birden fazla nesnenin bulunduğu bir sahnenin nasıl oluşturulacağıdır. Ben OGL2 yapardık ne OpenGL 3.x'te tek nesneleri nasıl çevirebilirim?

çevirmek ve döndürmek işlevlerini kullanarak 3D alanında "hareket" ve ben glBegin ... glEnd kullanarak bunları istediği yerel koordinatlara nesneleri yaratmaktı. OGL3'te bu işlevler tümüyle kullanımdan kaldırıldı ve anladığım gibi, shader'lar tarafından değiştirildi. Ama yaptığım her nesne için bir shaderprogramı arayamıyorum, değil mi? Bu diğer tüm nesneleri de etkilemez mi?

benim sorun tatminkar açıkladım olmadığından emin değilim, ama bunun çekirdek OpenGL 3.1 yerel koordinat sisteminde tanımlanmış birden nesnelerle bir sahne programlamak nasıl. Ben bulduğum tüm yeni başlayanlar öğreticiler sadece tek bir nesne kullanır ve bu sorunu çözmez.

Düzenleme: İki iplik küpleri istediğinizi düşünün. Her verteks koordinatını manuel olarak değiştiren bir ağrı olur ve modelview matrisini modifiye edemezsiniz, çünkü kamerayı iki statik küpün etrafında döndürmeyi tercih eder. Bu

cevap

20

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

+1

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

+0

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

1

Bu işlevler kullanımdan kaldırılmıştır, ancak teknik olarak hala mükemmel bir şekilde çalışır ve gerçekten derler. Yani kesinlikle translate3f (...) vb işlevlerini kullanabilirsiniz.

ANCAK, this tutorial iyi bir açıklaması var nasıl yeni shader ve böylece çalışma VE alanda birden nesneler için.

Vertexlerin x dizisini oluşturabilir ve bunları x VAO nesnelerine bağlayabilir ve sahneyi gölgelendiriciler vb. Ile işleyebilirsiniz. Meh, bunu okumak sizin için daha kolay - gerçekten iyi bir okuma yeni kavramları kavramak. The Official Guide to Learning OpenGL, Versions 3.0 and 3.1 -

Ayrıca denilen bu OpenGL 'Kırmızı Kitap' Yeni bir açıklaması vardır. “OpenGL’nin kullanımdan kaldırılma mekanizmasının tartışılması ve programlarınızın OpenGL’nin gelecekteki sürümleri için nasıl doğrulanacağı” nı içerir.

Bunu biraz yardım umut!

+0

Yine hızlı cevap için teşekkürler. Bahsettiğiniz öğreticiyi okudum, ancak iki üçgen oluştursa da, onları global koordinatlarda yaratıyor - istediğim kadar yerel değil. Sorun, daha karmaşık bir modele sahip olmanız, özellikle de model hareket ederse küresel koordinatları kullanmanın zor olabileceğidir. Ayrıca, bir prefabrik nesneyi bir .obj dosyasından yüklemek ve 3B alanda bir yere yerleştirmek istiyorum. – Wonko

+8

@Mark İlk bağlantı bozuk. – Jeff

İlgili konular