3B oluşturmada endekslerin amacı nedir?


11

OpenGL'de bir 3D küp oluşturduğunuzu varsayalım. Nesne (küp) için gerekli köşe verilerini uygularsınız. Endeksleri kullanmanın anlamı ne olurdu?

v

 void CreateCube()
        {
            const Vertex VERTICES[8] =
            {
                { { -.5f, -.5f,  .5f, 1 }, { 0, 0, 1, 1 } },
                { { -.5f,  .5f,  .5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f,  .5f, 1 }, { 0, 1, 0, 1 } },
                { {  .5f, -.5f,  .5f, 1 }, { 1, 1, 0, 1 } },
                { { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
                { { -.5f,  .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
                { {  .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
            };

            const GLuint INDICES[36] =
            {
                0,2,1,  0,3,2,
                4,3,0,  4,7,3,
                4,1,5,  4,0,1,
                3,6,2,  3,7,6,
                1,6,5,  1,2,6,
                7,5,6,  7,4,5
            };

    //....

    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

Yukarıdaki örnekte, dünya uzayında gerekli köşeleri olan bir küp yaratılmıştır. Endekslerle ilgisi nedir?


1
Birçok yerde insanların yüzlerini çağırdığını göreceksiniz. Ve işte bu onlar. Her yüz genellikle bir üçgen oluşturmak için 3 köşeden oluşur. Bu nedenle, her 3 endeks son ağdaki bir üçgene karşılık gelir. Bunlar indeksler olarak adlandırılır, çünkü esas olarak gerçek köşe bilgisinin köşe dizisinde nerede olduğu ofsetleridir. Endeksler hakkında bilmeniz gereken her şey, sanırım :)
Grimshaw

Yanıtlar:


24

Bir 3D modeli temsil etmek için gereken bellek ayak izini azaltmak için endeksler vardır; bu, bir 2D görüntünün bellek ayak izini azaltmak için renk paletlerinin kullanılabileceği gibi.

Endeksleme, genellikle karmaşık bir model için yapmanız gerektiği için bu tepe noktasının verilerini çoğaltmanız gerekiyorsa, bir tepe noktasının tam tanımını tekrarlamaktan kaçınmanıza olanak tanır.

Modern 3D API'leri üçgen kullanarak oluşturulur; bir küpün her yüzü iki üçgen gerektirir:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

Bu yüzü dizinsiz olarak belirtmek için köşeleri belirtmeniz gerekir A, B, D, A, D, C. Tepe tamponunda iki köşe ( Ave D) tekrarlanır.

Bununla birlikte, indisli, sadece gerekli olan köşe (ihtiva eden bir tepe tampon olabilir A, B, Cve D) ve altı endeksleri: 0, 1, 3, 0, 3, 2. Endeksler genellikle köşe noktalarından çok daha küçük olduğundan ve çoğu köşe noktası genellikle pratik modellerde tekrarlandığından, bu önemli yer tasarrufu sağlayabilir.

Bazı köşelerin yalnızca kısmi nitelikleri paylaşacağını unutmayın. Örneğin, doku eşlemeli bir küp oluştururken, kişi genellikle yüz başına benzersiz doku koordinatları ister, böylece aynı konuma ve farklı doku koordinatlarına sahip birden fazla köşeye sahip olursunuz. Bu çoğaltma miktarı kabul edilebilir ve gereklidir; Bir yinelenen zaman bu kadar tüm tepe grubu Endekslemede faydalarını görmeye başlardım o bağlıyor.

Gerçekten de tüm kafes köşe noktalarınız% 100 farklıysa, endekslerin hiçbir faydası yoktur (aslında yedek dizin tamponunun tüketiminde daha fazla alan kullanırsınız). Ancak bu her zaman gerçekleşmez.


1
Bunun yerine 0,1,3, 0,1,2 olmalı mı?
Sad CRUD Developer

0, 1, 3, 0, 3, 2 aslında, teşekkürler (A = 0, B = 1, C = 2, D = 3 tabanlı). Cevabı güncelledim.

belki bir üçgen örgü üzerinde bir tepe noktasına bitişik ortalama üçgen sayısının 6 olduğunu belirtmek gerekir.
Arne

7

Endeksleri kullanmak üç ana amaca hizmet eder:

  • Orijinal ağdan yinelenen köşelerin kaldırılmasını sağlayarak bellek gereksinimlerini azaltır.
  • Yinelenen köşelerin yalnızca bir kez dönüştürülmesini sağlayarak tepe gölgelendirici hesaplamalarını azaltma.
  • Temel öğeleri birleştirerek çizim çağrılarını azaltmanıza olanak tanır.

Bunlardan ilki açıktır, çünkü bunu doğrudan kendi kodunuzda ölçebilirsiniz: örneğin, bir kafesin 50k köşeleri varsa, ancak 30k tanesi çoğaldıysa, bir bellek tasarrufunuz olur.

İkincisi ve üçüncüsü o kadar açık değil - zaten endeksleri kullanmaya karar vermiş olmanız ve kodunuzu profilinize almanız ve bir ölçüm almak için "önce" ve "sonra" performansını izole etmeniz gerekiyor.

İkincisi için, donanım yakın zamanda dönüştürülmüş köşelerin sonucunu önbelleğe alabilir. Yakın zamanda dönüştürülmüş olanla aynı köşe noktası gelirse, hesaplamaları tekrar yapmak yerine önbelleğe alınan sürüm kullanılabilir. Donanım bunları tanımlamak için dizini kullanır, bu nedenle bu davranışı elde etmek için dizinler kesinlikle gereklidir.

Üçüncüsü için, yaptığınız her çizim çağrısında ne kadar GPU çalışması gerektiğine bakılmaksızın bir CPU yükü vardır. Diğer her şey eşitse, 1 çizim çağrısında 50k ağ çizmek, 10k çizim çağrısında çizmekten çok daha hızlı olacaktır. Ancak ağınız birden çok şeritten veya (hatta daha da kötüsü) bir şerit ve fan kombinasyonundan oluşuyorsa, (1) indeks kullanmadan veya (2) dejenere üçgenler girmeden tek bir çizim çağrısında yapamazsınız. Ancak endeksler köşelerden çok daha küçük olduğu için, genel durumda endekslerin kullanılması tercih edilir.


0

Endeksler, hangi üç köşeden oluşan grupların küpün yüzlerini oluşturduğunu söyler. Üçgenin üç köşesinin her biri üçgenin yüzleri değildir.

Her tepe noktasını tam olarak bir kez kullanabilir ve sadece bir üçgenden daha fazla kullanılanları birçok kez tekrarlayabilirsiniz, ancak bu ekstra köşe dönüşleri anlamına gelir. Endekslerle köşeleri yalnızca bir kez dönüştürür ve ihtiyacınız olduğu kadar kullanırsınız.


Üçgen demek istediğin zaman ??
Sad CRUD Developer

Modern grafik donanımı her şeyi üçgen olarak işler.

1
Eğer varsa gerçekten neler olup bittiğini anlamak istiyoruz, bazı grafik kağıdı almak 3D köşeleri çizmek ve endeksler tarafından belirtilen noktalar arasında çizgiler çizmek.
ggambett
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.