Ben gibi malzeme sistemleri nasıl başımı etrafında sarmak için çalışıyorum bu , bu uygulanmaktadır. Bu güçlü ve kullanıcı dostu, grafik benzeri sistemler , programcıların ve programcı olmayanların hızla gölgelendirici oluşturmasına izin verme yöntemi olarak nispeten yaygın görünmektedir . Ancak, grafik programlama konusundaki sınırlı deneyimimden, nasıl çalıştıklarından tam olarak emin değilim.
Arka fon:
Bu nedenle, daha önce basit OpenGL oluşturma sistemlerini programladığımda , genellikle el ile oluşturduğum statik GLSL dosyalarından gölgelendiricileri yükleyen, derleyen ve bağlayan bir Material sınıfı oluştururum. Genellikle bu sınıfı GLSL tekdüzen değişkenlerine erişmek için basit bir sarıcı olarak oluştururum. Basit bir örnek olarak, bir doku geçmek için ekstra tekdüze bir Texture2D içeren temel bir köşe gölgelendiricisine ve parça gölgelendiricisine sahip olduğumu düşünün. Malzeme sınıfım bu iki gölgelendiriciyi bir malzemeye yükler ve derler ve bu noktadan sonra bu gölgelendiricinin Texture2D üniformasını okumak / yazmak için basit bir arabirim ortaya koyar.
Bu sistemi biraz daha esnek hale getirmek için, genellikle herhangi bir ad / tür üniformasını geçirmeye çalışmamı sağlayacak şekilde yazıyorum [yani: SetUniform_Vec4 ("AmbientColor", colorVec4); bu, AmbientColor üniformasını, malzemede bu üniforma varsa "colorVec4" adlı belirli bir 4d vektörüne ayarlayacaktır.] .
class Material
{
private:
int shaderID;
string vertShaderPath;
string fragSahderPath;
void loadShaderFiles(); //load shaders from files at internal paths.
void buildMaterial(); //link, compile, buffer with OpenGL, etc.
public:
void SetGenericUniform( string uniformName, int param );
void SetGenericUniform( string uniformName, float param );
void SetGenericUniform( string uniformName, vec4 param );
//overrides for various types, etc...
int GetUniform( string uniformName );
float GetUniform( string uniformName );
vec4 GetUniform( string uniformName );
//etc...
//ctor, dtor, etc., omitted for clarity..
}
Bu işe yarıyor, ancak Material sınıfının müşterisinin sadece iman üzerindeki üniformalara erişmesi gerektiği için kötü bir sistem gibi geliyor - kullanıcı, her maddi nesnede bulunan üniformalardan biraz haberdar olmalı, çünkü GLSL adıyla iletin. Sistemle çalışan sadece 1-2 kişi olduğunda çok büyük bir anlaşma değil, ancak bu sistemin çok iyi ölçekleneceğini hayal edemiyorum ve bir sonraki OpenGL oluşturma sistemini programlama girişimimi yapmadan önce seviyelendirmek istiyorum biraz yukarı.
Soru:
Şimdiye kadar buradayım, bu yüzden diğer render motorlarının malzeme sistemlerini nasıl ele aldığını araştırmaya çalışıyorum.
Bu düğüm tabanlı yaklaşım harika ve modern motorlarda ve araçlarda kullanıcı dostu malzeme sistemleri oluşturmak için son derece yaygın bir sistem gibi görünüyor. Söyleyebileceğimden , her düğümün malzemenizin bazı gölgelendirici yönünü temsil ettiği ve her yolun aralarındaki bir tür ilişkiyi temsil ettiği bir grafik veri yapısına dayanıyorlar .
Söyleyebileceğim kadarıyla, bu tür bir sistemi uygulamak, çeşitli alt sınıflara (TextureNode, FloatNode, LerpNode, vb.) Sahip bir MaterialNode sınıfı kadar basit olurdu. Her MaterialNode alt sınıfının MaterialConnections'a sahip olacağı yer.
class MaterialConnection
{
MatNode_Out * fromNode;
MatNode_In * toNode;
}
class LerpNode : MaterialNode
{
MatNode_In x;
MatNode_In y;
MatNode_In alpha;
MatNode_Out result;
}
Bu çok basit bir fikir, ama bu sistemin birkaç yönünün nasıl çalışacağından biraz emin değilim:
1.) Unreal Engine 4'ün kullandığı çeşitli 'Malzeme İfadeleri'ne (düğümleri) bakarsanız, her birinin çeşitli tiplerde giriş ve çıkış bağlantılarına sahip olduğunu göreceksiniz. Bazı düğümlerin çıkışları, bazıları çıkış vektörü2, bazıları çıkış vektörü4 vb. Çeşitli giriş ve çıkış türlerini destekleyebilmeleri için yukarıdaki düğümleri ve bağlantıları nasıl geliştirebilirim? MatNode_Out'u MatNode_Out_Float ve MatNode_Out_Vec4 (ve benzeri) ile alt sınıflandırma akıllıca bir seçim olur mu?
2.) Son olarak, bu tür bir sistem GLSL gölgelendiricileri ile nasıl ilişkilidir? Yine UE4'e bakıldığında (ve benzer şekilde yukarıda bağlanmış diğer sistemler için), kullanıcının sonunda bir miktar malzeme düğümünü, gölgelendirici parametrelerini (temel renk, metallik, parlaklık, emisyon, vb.) Temsil eden çeşitli parametrelere sahip büyük bir düğüme takması gerekir. . Orijinal varsayımım, UE4'ün çeşitli üniformaları olan bir çeşit sabit kodlu 'ana gölgelendirici' olduğu ve kullanıcının 'malzemesinde' yaptığı her şey, düğümlerini ' ana düğüm '.
Ancak, UE4 belgeleri şunları belirtir:
"Her düğüm, belirli bir görevi gerçekleştirmek üzere belirlenmiş bir HLSL kodu snippet'i içerir. Bu, bir Malzeme oluştururken görsel komut dosyası oluşturma yoluyla HLSL kodu oluşturduğunuz anlamına gelir."
Bu doğruysa, bu sistem gerçek bir gölgelendirici komut dosyası oluşturur mu? Bu tam olarak nasıl çalışıyor?