Bir Varlık / Bileşen sistemindeki malzemeler nasıl kullanılır?


13

E / C uygulamam, Varlıkların yalnızca ID'ler, Bileşenler veri olduğu ve Sistemlerin Veriler üzerinde hareket ettiği temel uygulama. Şu anda genel olarak nesne malzemeleri ve renderleme konusunda sorun yaşıyorum. Basit nesneler için ModelComponent, a'ya bağlı bir RenderSystem, ModelComponentrender sisteminin kullandığı köşe tamponu kimlikleri var. Basit bir MaterialComponentmuhtemelen renk veya aynasal mukavemet vb. Olurdu, ama ben birden fazla render geçişi ve basit bir değişken kadar kolay olmayan genel "efektler" sağlamak için yeterince esnek olmasını istedim MaterialComponent.

Bu sorunları çözmeye çalışırken iki çözüm buldum:

1 - Süper jenerik Malzeme Bileşeni

Bunun gibi bir şey:

struct Material : public Component
{
    ShaderData* shader;
    std::vector<std::pair<std::string, boost::any>> uniforms;
    [...]
};

ve render sisteminde üniformaları gölgelendiriciye geçirip geçirdim. Bunun yavaş, ama benim amacım için yeterince hızlı olacağını düşünüyorum.

2 - Başka bir soyutlama katmanı, MaterialData

Belirli malzemeleri sarmak için belirli bir materyali sarmak için bir sınıfa sahip olmak, temel sınıfın bir şeye sahip olacağını, void set_shader_constants(ShaderData* d)ancak uygulamanın her sınıfa kadar olduğunu ve MaterialComponentMaterialData nesnesine bir işaretçi olacağını.

Hangi yaklaşımı tercih edeceğimden emin değilim, ama bunların hiçbiri çoklu geçiş konusuna veya diğer karmaşık oluşturma tekniklerine dokunmuyor.

Bunu nasıl başaracağınız hakkında bir fikriniz var mı?

Yanıtlar:


26

Malzemeler bir grafik konseptidir ve oluşturucunuza aittir. Oluşturucu, bir varlık sisteminin üzerine inşa edilemeyecek kadar düşük düzeyli bir mimari parçasıdır. Varlık sistemleri daha üst düzey oyun nesneleri için olmalıdır. Her şeyin bir bileşen olması gerekmez ve aslında her şeyi böyle bir paradigmaya zorlamak genellikle kötü bir fikirdir. En az ortak payda çözümü yaratır.

Sonuç olarak, farklı bir yaklaşım benimsemenizi tavsiye ederim:

  • Malzeme, oluşturucunuzdaki başka bir türdür.
  • Oluşturucunuzda "ekrana çizilecek bir şeyi" temsil eden bir tür var. Bunlara genellikle "render örnekleri" veya "yenilenebilir" veya hatta "modeller" denir. Bu tür, çizim yaparken kullanacağı malzemeye referans verir ve oluşturucu tüketicisinin bu malzemeyi istenen her şeye ayarlamasına izin vermek için genel bir API sağlar.

Bu esas olarak sizden almanızı ModelComponentve yeniden adlandırmanızı Model, varlık / bileşen katmanına bağımlılığı ortadan kaldırmanızı ve böylece oluşturucunuzun geri kalanıyla birlikte daha düşük bir soyutlama katmanına taşımanızı ister.

Sonra bunu yaparsınız:

  • Diğer bileşenlerinizle aynı soyutlama katmanında, bir varlığın görsel sunumunu temsil eden bir çeşit "görünüş bileşeni" vardır. Bu bileşen, sadece bir malzemeye referansı içeren bazı yenilenebilir (yukarıda açıklandığı gibi) bir referans içerir. Bileşen, yenilenebilir öğeyi açığa çıkarmak için bir API sağlayabilir (böylece istemcilerin değiştirmesine izin verir) veya maruz kalmayı denetlemek için yenilenebilirin API'sini sarabilir. Bu size kalmış.

Bu, modellerin ve malzemelerin her ikisi de bileşen olmasını sağlayarak karşılaştığınız bileşen bağımlılığı sorununu giderir; bir işletmenin ya bir yönü olmalı ya da olmamalı ve bu husus, malzeme de dahil olmak üzere, işletmenin sunumuyla ilgili her şeyi kodlayabilmelidir.

Bu aynı zamanda, render sistemi soyutlamasının geri kalanıyla eşlik olmaması nedeniyle, bu nesne ile bir bileşen olarak daha zor olabilecek malzeme nesnesiyle başka yaklaşımlar alma esnekliği sağlar.

Daha karmaşık efektlere ve çoklu geçişlere izin verme sorununuz, esas olarak malzemede çözülebilen, işlevlerin malzemenin gölgelendirici dosyası tarafından maruz bırakılan adlandırılmış gölgelendirici sabitlerini sorgulamaya ve ayarlamasına neden olabilir. Bu, özellikle birden çok geçişi ve benzerini destekleyen efekt dosyaları (D3D'de) kullanıyorsanız doğrudur. Efekt dosyaları kullanmasanız bile, her biri farklı gölgelendiricilere sahip olan malzemeden birden fazla geçiş fikrini ortaya çıkarabilir ve malzeme API'sının bunun için manipülatörler sağlamasına izin verebilirsiniz. Materyal şimdi aynı soyutlama seviyesinde olduğundan, oluşturma API'sına entegre etmek daha kolay ve daha temiz olurdu.


1
Cevabınız için teşekkürler, bu sorun beni bir süre rahatsız ediyordu, ancak E / C kısıtlamaları olmadan bir oluşturucu oluşturmak çok daha kolay.
Luke B.10
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.