我已经用Java编写了自己的3D游戏引擎,但我想重写它以进行优化。
我的引擎看起来像这样:
有一个名为RenderSystem的抽象超类。 代码:
public abstract class RenderSystem<T> {
public abstract void addElement(T element);
public abstract void enableSystem();
public abstract void disableSystem();
protected abstract void cleanUp();
}
每个RenderSystem扩展&#34; RenderSystem&#34;。 对于每种不同的材质,都有一个渲染系统,因此有一个着色器。 我创建了一个枚举,用于存储我的素材的哪些部分已启用(bump_map,displacement_map等)。
看起来像这样:(我错过了所有吸气剂和二传手的东西) 代码:
public enum MaterialType{
COLOR_MAT (1,false,false,false,false,MasterRenderer.entity_system,null);
private MaterialType(int index, boolean use_bump_map, boolean use_displacement_map, boolean use_normal_map,
boolean use_specular_map, RenderSystem<?> default_system, RenderSystem<?> instanced_system) {
this.index = index;
this.use_bump_map = use_bump_map;
this.use_displacement_map = use_displacement_map;
this.use_normal_map = use_normal_map;
this.use_specular_map = use_specular_map;
this.default_system = default_system;
this.instanced_system = instanced_system;
}
private final int index;
private final boolean use_bump_map;
private final boolean use_displacement_map;
private final boolean use_normal_map;
private final boolean use_specular_map;
private final RenderSystem<?> default_system;
private final RenderSystem<?> instanced_system;
//...................
在这个例子中,我只存储了一个Material,除了color_map(总是启用)之外,它不使用任何这些map。 此外,它存储处理使用该材料的那些实体的系统。 代码: MasterRenderer.entity_system
这将用其他所有东西完成,我将添加一个天幕材料,粒子材料等。这一切都很直接,但我现在的问题是,我需要哪些着色器?
我应该为每个实体写一个着色器,(实体是通过使用obj。文件创建的,不包括粒子等) 或者一个着色器用于正常渲染而没有bump_maps和所有这些东西,还有一个着色器用于我的材质和normal_map? 这意味着我使用那个着色器渲染每个实体,即使它没有任何这些地图来计算那些东西。
此外,我想为我的角色添加一个BoneSystem。我想这应该有自己的着色器? 下面我将列出我将创建的着色器:
我可能会添加一些postProcessing效果,但这还不安全。
我只是想知道这种结构是否合适有效还是我应该改变什么?
此外,游戏中通常使用多少个着色器?