写代码这么久,材质、渲染状态和shader的问题一直给我有很大的困拢,今天为了整理一下思路,决定写一下设计文档和序列图。经过这样一写,和对之前渲染状态管理的一些文章的理解,思路终于清楚了一点。
原来我是把材质使用及shader的调用都写在一起,这样写很不好。因为渲染状态与shader是应该分组,然后在某一组中只调用一次,而材质的使用(一般是纹理的使用),是每个renderobject都在渲染前都要设置的。
我觉得比较合理的做法是:把渲染状态与shader封装在一起,我这里统称shader,假如使用了effect,可以不做渲染状态的封装。然后,在渲染前要根据场景或整个游戏中用到的相同的shader进行分组。然后把拥有这些shader的物体都放进该shader的渲染队列中去。在渲染过程中,首先遍历所有组,在每组开始时,设置好渲染状态,包括shader的全局参数的设置,然后针对每个渲染物只做设置材质的操作(这里的操作是:设置纹理、设置shader需要从renderObject中取得的参数)。
排序流程:首先根据shader分组,把相同分组的渲染物放到同一个队列, 然后,在同一个队列中,把相同材质的放在一起,这样就可以减少纹理的切换。呵呵,今天先写这么多,接下来要好好设计一下。