我的E / C实现是一种基本的实现,其中实体只是ID,组件是数据,系统根据数据进行操作。现在,我在处理对象材质和渲染时遇到了麻烦。对于简单的objetc,我有一个ModelComponent
与绑定的RenderSystem
,ModelComponent
具有渲染系统使用的顶点缓冲区ID。一个简单的对象MaterialComponent
可能具有颜色或镜面反射强度等,但是我希望它具有足够的灵活性,以允许多个渲染过程和一般的“效果”,而这些效果不如的简单变量那么容易MaterialComponent
。
为了解决这些问题,我想出了两种解决方案:
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对象的指针。
我不确定我会选择哪种方法,但是这些方法都不涉及多次通过或其他复杂的渲染技术。
关于如何做到这一点的任何想法?