私のE / C実装は、エンティティが単なるIDであり、コンポーネントがデータであり、システムがデータに基づいて動作する基本的な実装です。現在、私はオブジェクトのマテリアルとレンダリング全般に問題を抱えています。単純なオブジェクトの場合、ModelComponent
に関連付けられているRenderSystem
にModelComponent
は、レンダリングシステムが使用する頂点バッファーIDがあります。シンプルMaterialComponent
はおそらく色や鏡面強度などを持っているでしょうが、複数のレンダーパスとの単純な変数ほど簡単ではない一般的な「効果」を可能にするのに十分な柔軟性が必要でしたMaterialComponent
。
これらの問題を解決しようとして、2つの解決策を思いつきました。
1-超汎用材料コンポーネント
このようなもの:
struct Material : public Component
{
ShaderData* shader;
std::vector<std::pair<std::string, boost::any>> uniforms;
[...]
};
レンダリングシステムでは、ユニフォームをループしてシェーダーに渡します。これは遅いと思いますが、私の目的には十分な速さです。
2-別の抽象化レイヤー、MaterialData
特定のマテリアルをラップするクラスを持ち、それは特殊なマテリアルに継承できますが、基本クラスは次のようなものになりますvoid set_shader_constants(ShaderData* d)
が、実装は各クラスにMaterialComponent
依存し、MaterialDataオブジェクトへのポインターを持ちます。
私がどちらのアプローチを好むかはわかりませんが、これらはどちらも複数のパスや他の複雑なレンダリング技術の主題には触れません。
これを達成する方法についてのアイデアはありますか?