İnsanlar sürekli en azından Vertex Array'ları kullanmamı söylüyor. Ama ben 3d dünyasında bir nesneyi konumlandırmak için glTranslatef/glRotatef
ile glPushMatrix()
kullanıyorum beri iyi bir fikir değil düşünüyorum.OpenGL: Vertex dizilerini kullanarak derinlemesine sıralama ile verimli render sistemi nasıl tasarlanır?
glPushMatrix()
'u kullanmayı bırakıp dünyadaki döndürülen/taşınan vertex konumlarını "el ile" hesaplamalıyım ve daha sonra vertex verilerini bir köşe dizisine itmeli ve sonra hepsini bir seferde oluşturmalı mıyım? ben de derinlik boylanmalıdır ekrandaki tüm nesneler için farklı doku yüzey kullandığımızda
Ama bütün bu daha da berbat alacak.
Böylece:
- I hem de doku yüzeyi kimliği ile her nesnenin saklanması gerekir.
- Tüm görünen nesneleri Z konumlarına göre sıralıyorum (oyun yalnızca aşağıdan yukarıya bakacak ve tüm nesneler düz olacak şekilde).
- yeni tampon oluşturma ve bu tampon içine normaldir sadece tepe/texcoord/renk/kopyalama:
- doku yüzeyi kimliği önceki kimliğinden değişti her zaman, ben bağlayacak bu sıralanan dizide gider
- Doğru doku kimliğine:
- Topladığım vertex verilerini yükleyin.
- Geçici köşe dizisi için kullanılan arabelleği boşaltın.
- Başta sıraladığım tüm verileri gözden geçirene kadar adım 4-7'yi tekrarlayın.
- Sıralı dizi verilerimi serbest bırakın ve 1-9 arasındaki adımları yineleyin.
Am i Doğru yapıyor?
Ayrıca, sıralayacağım nesneler için veri yapısını nasıl tasarlamalıyım? Örneğin, her nesne için vertex verilerini depolamak std::vector
kullanmak iyidir? Yoksa daha iyi bir alternatif var mı? Ben std::vector
Bütün bu veriler gibi görünür depolamak için bunu düşünüyordum: 4. adıma,
struct GameObject {
int TexID;
float z; // we will sort by this
vector<VTCNStruct> VertexData; // store each point of the object here (including color/normal/texcoord points).
};
vector<GameObject> GameObjectBuffer; // push all sortable objects here
,: bu durumda mevcut std::vector
kullanmak mümkündür? Ben verteks dizi benim GPU göndermek için new float[100]
gibi ham diziler kullanmanız gerektiğini, ya da her zaman doku kimliği değişiklikleri her defasında yeni tampon oluşturmadan bir şekilde (zaten verimli) benim zaten mevcut sıralanmış std::vector
kullanabilirsiniz ?
başına 4 * 32 bit "Nesne başına bir tepe dizisi tutmalı" - tüm bu zeki mi? Nesnelerimin çoğu sadece dörtlü olduğu için ve GPU'ya (renkli/normal diziler aracılığıyla) daha fazla veri göndermediğimde, bu daha fazla bant genişliği kullanmıyor, ama aynı zamanda her nesne arasında köşe dizisi yükleme komutları göndermem gerekiyordu . – Newbie
Dönüşümlerimi bir matrise nasıl daraltırım? Ayrıca, arkadan öne demek istemiyor musun? Yani, temelde 'glPushMatrix()' i saklayacağımı mı düşünüyorsun ama glBegin/glEnd yerine köşe dizileri kullanacağım? Eğer VBO kullanmak istediysem, önerdiğin aynı yaklaşımı tutmalı mıyım? – Newbie
Acemi bir OpenGL programcısı değilim, ama inanıyorum ki, Josh en önce en arkadaki en uzaktaki nesneyi (örn., Ekrana dolaba dolacak) nesneler çizmelisiniz. DÜZENLEME - Dönüşümleri tek bir matrise dönüştürerek, hem dönüş/hem de döndürme/dönüşüme bir dönüşüm elde etmek için bazı matematik hilelerini kullanabileceğinizi düşünüyorum. birinde düştü. – ZachS