Köşe Sayısı Motorda 3D Yazılımdan Daha Yüksek

Unity veya Unreal Engine’de Blender, Maya veya Max gibi bir yazılımdan bir 3D ağı içe aktardıktan sonra, motordaki köşe sayısının 3D yazılımda gördüğünüz köşe sayısından daha fazla olduğunu fark edebilirsiniz.

Kısa süre önce, köşe başına bir hesaplama gölgesi r çalıştırdığım bir demo yazıyordum. Blender’da sahip olduğum köşe sayısının Unity’nin bana gösterdiği köşe sayısından çok daha az olduğunu fark ettim. Ağları yumuşak gölgelendirme ile dışa aktarmanın bunu çözeceğini düşündüm, ancak burada hiç düşünmediğim şeyler olduğu ortaya çıktı. Bunu araştırmak bana farklı forumlara dağınık cevaplar verdi, bu yüzden bu yazıyı yazmaya ve bunun neden olduğunu açıklamaya karar verdim. Bu, işi iş başında öğrenen veya düşünmek için biraz zaman harcayan çoğu insan için çok açıktır, ancak yanınızda deneyimli bir danışman yoksa, bu basit soruya tam bir yanıt bulmak şaşırtıcı derecede zordur.

Köşe Nedir

Köşenin ne olduğunu anlamak, bu sorunu anlamak için önemlidir. Tepe noktaları genellikle konumlarla karıştırılır. Bir tepe noktası, bir konum değildir. Konum, bir tepe noktasının bir niteliğidir. Ben de bundan suçluydum ve bu konuda kafamın karıştırılmasının doğal olduğunu düşünüyorum, çünkü geometride tepe noktası iki çizginin kesiştiği noktadır. Ve bir nokta, bir pozisyonu ifade eder.

Bilgisayar grafiklerinde bu tanım daha genel bir şeye taşınmıştır. Köşe, bir köşe gölgelendiricisi tarafından üzerinde çalışılan, gruplanmış bir öznitelik dizisi olan bir veri kabıdır. Gölgelendirici teriminin gölgelendiren bir programdan bir grafik kartı üzerinde çalışan bir programa nasıl değiştiğine benzer şekilde, köşeler de hesaplama gölgelendiricilerinden önce genel bilgi işlem için her türlü yaratıcı yöntemde kullanılıyordu. Dolayısıyla, konum özelliği olmayan bir tepe görmüş olabilirsiniz.

Yukarıdaki paragraf biraz teğettir, çünkü oyunlarda ve oyun motorlarında bir köşe neredeyse her zaman en azından içinde en azından bir konuma sahiptir. İki tepe noktası aynı konumu paylaşabilir ancak yine de farklı tepe noktaları olabileceğinden, normaller veya UV’ler gibi diğer köşe özelliklerinde farklılık gösterdiklerinden, tepe konumlarını ve tepe noktalarını ayırmak yine de önemlidir.

Motorunuzun veya 3B yazılımınızın tepe noktası sayısı olarak gösterebileceği istatistik, farklı ölçümlere hakemlik yapmaktadır. Bu farklı bakış açılarının üzerinden geçmeden ve her durumda kaç köşenin ne anlama geldiğini tartışmadan önce, gözden geçirmemiz gereken bir önemli tanım daha var.

Dizin Arabelleği Nedir

Üçgenleriniz söz konusu olduğunda, üçgenin her köşesi için bir tepe noktasına ihtiyaçları vardır. Öyleyse, üçgense N numaralı bir ağ, N * 3 köşeye ihtiyaç duyacaktır. Birkaç üçgen aynı köşeyi paylaşıyorsa, o köşeyi hafızaya birkaç kez kaydetmemiz için hiçbir neden yoktur. Bu yüzden insanlar dizin arabellekleri buldular.

Grafik ardışık düzenine 3 köşe noktası sağlamak yerine, bu köşelerin bellekte başka bir yerde, bir köşe arabelleğinde bir dizide nereye kaydedildiğini gösteren 3 indeks (kimlik) sağlarız. Üçgenlerin köşelerinin indislerini içeren diziye, indeks tamponu denir.

Bunun gibi, fazladan bir dizin arabelleğine sahip olma pahasına bellekte paylaşılan köşeleri kopyalamaktan kaçındık. Bu değerli bir değiş tokuş, ağımızın 65.536’dan az köşesi olduğu sürece, indeks arabelleğimiz için 16 bitlik tamsayılar kullanabiliriz. Örneğin, 20k köşeli bir ağ, dizin arabelleği için 0,04 mb ek yüke sahip olacaktır. Öte yandan, bu ağın çok sayıda paylaşılan köşesi varsa ve her köşe çok büyükse, yani çok sayıda yüksek hassasiyetli özellik varsa, alandan daha fazla tasarruf etmiş oluruz.

Dizin arabelleğinin ne olduğunu belirlediğimize göre, N sayıda üçgen içeren bir ağ için grafik API’sinin kaç köşeye ihtiyacı olduğuna bakalım.

Grafik API Tarafı

API söz konusu olduğunda, üçgen başına 3 köşe gölgelendiricisi çalıştırmanız gerekir (tam olarak değil, buna birazdan değineceğim). Yukarıda belirtildiği gibi, bir üçgenin çizilmesi, paylaşılması ya da paylaşılmaması için 3 köşesine ihtiyacı vardır. Bu nedenle motorlar, verileri nasıl seri hale getireceklerinden farklı olarak çalışma zamanı kullanımı için hazırlamak zorundadır. Grafik API’nin onlardan istediği format nedeniyle.

Ağınızda 10 bin üçgen varsa, programı 30 bin kez çalıştırmanız gerekir. Yukarıda belirtildiği gibi, bu tamamen doğru değil. Halihazırda bu önbelleğe kaydedilmiş olan aynı girdiye sahip bir tepe üzerinde bir köşe gölgelendiricisi çalıştırdıysanız, bir köşe gölgelendiricisini atlamanıza olanak tanıyan bir önbellekleme sistemi vardır. Bu önbelleğin boyutu donanımdan donanıma değişir ve bunu optimize etmenin farklı yolları vardır. Sürücünün hangi köşeleri önbellekte tutacağına ve ne zaman farklı bir köşe ile değiştireceğine nasıl karar verdiğini bilmiyorum. Özet olarak, sürücü köşe gölgelendiricinizde dönüştürdüğünüz bazı köşeleri hatırlar ve köşe programını tam olarak aynı girdiyle çalıştırmak üzereyseniz, yeniden çalıştırmak yerine önceki çalıştırmaların sonucunu kullanır. köşe gölgelendiricisi.

Dolayısıyla, köşe gölgelendirici sayınız, üçgen sayısının 3 katından az olabilir, ancak 3B yazılımınızda gördüğünüzden daha fazla olabilir.

Motor Tarafı

Motorunuz bir ağı içe aktardığında, bunu Grafik API’nin işleyebileceği şekilde hazırlaması gerekir. Motorlar ayrıca, bir ağı sabit sürücüye nasıl kalıcı olarak kaydettiklerine ilişkin farklı bir biçime sahip olabilir, daha fazlası sonraki bölümde.

Tercih edilen biçim, çoğu durumda dizin + köşe arabelleğidir. Peki köşe tamponunda kaç tane köşe göreceksiniz? Benim durumumda, köşe arabelleğim 23k köşesi içeriyordu, oysa Blender bana 16k köşesi gösterdi. Bunun kuralları basittir, bir köşenin gerçekten paylaşımlı olarak kabul edilebilmesi için tüm özelliklerinin tamamen aynı olması gerekir. Bu, sadece aynı konuma değil, aynı zamanda normallere, teğetlere, UV’lere vb. Sahip olmak anlamına gelir.

Normaller basittir. Farklı yüzler arasında paylaşılan köşe konumları farklı normallere sahip olduğundan, bölünmüş normallere ve farklı yumuşatma gruplarına sahip sert kenarlara sahip olmak, motor tarafındaki tepe sayınızı artıracaktır. Bunu optimize etmek için, düzgün gölgelendirme gibi şeyler yapabilirsiniz; burada, onu paylaşan tüm yüzlerde bir tepe noktasının ortalamasının alındığı ve sert kenarları yeniden yapılandırmak için ayrıntılı normal haritaları kullanabilirsiniz.

UV’ler biraz daha yanıltıcıdır. Aynı konumdaki, farklı yüzlere ait olan iki tepe noktası, bu yüzler farklı adalardaysa aynı UV’lere sahip olmayacaktır. Bu nedenle, UV taraflarında köşe tampon sayınızı optimize etmek istiyorsanız, sarmalamayı optimize etmeniz gerekir. Daha spesifik olarak, daha az ada için optimizasyon yapmalısınız.

Vertex Color veya başka herhangi bir şey gibi diğer özellikler için normal haritalar gibi benzer numaralar kullanılabilir. Bilgileri bir dokuda pişirmek için. Bu bilgileri dokudan okuma gecikmesinin, optimize ettiğiniz başka bir şeyden daha yüksek olabileceği bir devrilme noktası vardır. Bu nedenle, gerçekten optimize edip etmediğinizi veya işleri daha kötü hale getirip getirmediğinizi öğrenmek için her zaman kıyaslama yapmalısınız.

Mesh Biçimleri Taraflar

FBX ve Obj gibi formatların bir ağı nasıl kaydettiği, motorun bunları RAM’de nasıl açtığına kıyasla diğer önceliklere dayanır. Bazı örnekler dosya boyutu, yükleme / kod çözme süresi, kod çözücü ve kodlayıcı programlama kolaylığı ve insanlar tarafından okunabilirliktir.

Yukarıda belirtildiği gibi, fazladan bir endeks arabelleğine sahip olmanın değiş tokuşu iyi bir seçimdir. Öyleyse neden bir adım daha ileri götürmüyorsunuz ve özellik başına bir indeks tamponuna sahip olmuyorsunuz? Her köşe için, bir yerine birkaç endeks kaydedersiniz. Her dizin, biri konum, diğeri UV’ler için olmak üzere farklı özniteliklerin konumuna işaret ediyor.

Bunun avantajı, dosyada yinelemeyi azaltabilmenizdir. Birkaç örnek dışında Köşe Rengi’nin çoğunlukla siyah olduğu bir senaryo hayal edin, ancak konum, normaller veya uv’ler gibi diğer özellikler aynı olmadığından, yalnızca bir dizininiz varsa tüm bu köşeler tek bir köşede birleştirilemez tampon. Ancak özellik başına bir dizin arabelleğiniz varsa, her yerde aynı Köşe Rengini kopyalamaktan kaçınır ve yalnızca varyasyonlarınız olduğu kadar çok köşe rengini kaydedersiniz.

Diğer bir avantaj, bu listeleri farklı şekilde sıkıştırabilmenizdir. Farklı algoritma kullanarak bir özelliği diğerinden daha fazla sıkıştırmak isteyebilirsiniz.

3D Yazılım Tarafı

Nihayet 3D yazılım tarafına ve Blender’ın Unity’den çok daha az köşe göstermesinin nedenine geldik.

Bir 3D yazılım buna istediği gibi yaklaşabilir. Köşe sayısını azaltmak için yukarıdaki yöntemlerden herhangi birini veya hatta üçgen yerine dörtlü kullanmak gibi başka şeyleri kullanabilir. Oluşturulmaya başladığında, oyun motoruyla benzer sınırlamalarla karşı karşıya kalır.

Bir 3B düzenleme yazılımının, OBJ gibi formatların ağı kaydetmesine benzer bir şey yapmasının avantajları vardır. Örneğin, Blender’da bir tepe noktasını hareket ettiriyorsanız, normallerini veya UV’lerini değiştirmezsiniz. Yalnızca tepe konumu. Bir küpün 8 köşesi vardır. Her köşe yalnızca bir konumdan oluşuyorsa, köşe arabelleğinizde 8 köşeniz olur. Diyelim ki bir köşeyi kaydırdınız. Uygulamanın o noktayı hareket ettirmesi gerekiyor.

Şimdi bu üçgen küpü en aptalca şekilde açıyoruz, her üçgen kendi adası oluyor. Ağı motorda nasıl yaptığımızı kaydedersek, köşe tamponumuz 8 köşeden 36’ya gider. Toplam 12 üçgen, üçgen başına 3 köşe, artık her birinin kendi UV’leri vardır. Şimdi bir köşeyi hareket ettirirsek, hangi köşe olduğuna bağlı olarak, programın maksimum 6 köşeyi hareket ettirmesi gerekir. Bunlar, bir konumu paylaşan ancak farklı UV’leri olan 6 köşedir.

Öznitelik başına bir dizin arabelleğimiz olsaydı, yalnızca bir örneği düzenleme ihtiyacına geri dönebilirdiniz. Yalnızca konumları hareket ettirdiğiniz ve UV’lerle hiçbir şey yapmadığınız sürece, bu 8 köşe arasında paylaşılan köşe konumunu yalnızca bir kez düzenlersiniz.

Diğer bir avantaj, Mesh Formats bölümünde belirtildiği gibi birkaç dizin arabelleğine sahip olarak bellekten tasarruf ediyor olmanızdır.

Dolayısıyla, Blender’da 16k köşeleri gibi bir istatistik gördüğünüzde, bunun daha çok 16k köşe konumlarının çizgileri boyunca olması gerekir. Durumun bu olup olmadığını öğrenmek istiyorsanız, ağınızı farklı bir şekilde açmayı deneyin. Bu, köşe sayılarını değiştirmezse, metrik büyük olasılıkla köşe konum arabelleğindeki üye sayısına atıfta bulunmaktadır. Ayrıca, dörtlü ağa değil üçgen ağınıza baktığınızdan emin olun.

Okuduğunuz için teşekkürler, beni Twitter’ımdan takip edebilirsiniz: IRCSS