这几天写完了材质系统,开始处理渲染状态管理的问题,一般来说当场景管理器筛选出所有可见的物体后,并不会直接画到屏幕,而是还要进行一些排序组织处理等,比如对于透明物体的Alpha排序,深度排序,按照渲染状态的组织等工作。目前和所有引擎一样我将这些可渲染的物体丢给一个渲染队列进行处理,渲染队列是物体画到屏幕上去之前的最后一道组织工序,根据物体的属性 会对需要alpha排序的物体进行排序,对于普通物体,会根据尽量减小材质切换次数的原则进行排序,我这里的实现很简单参考了ogre中的方法 Ogre将一个pass的第一,二层纹理以及渲染Pass的值编码成了一个32位整型,而我则是单独定义了一个GFRenderStateHash类目前该类有2个32位整型第一个整型将Pass值和VertexShader以及Pixelshader的名字进行Hash以后编码到第一个整型,第2个整型编码了2个纹理的Hash值,渲染队列在插入克渲染物体的时候会根据这2个值来进行有序插入,因为查过一些资料表示Vs,ps的切换所需耗时貌似还在纹理之上。至于其他状态切换没有进行编码因为这样在排序上花费时间容易超过收益,得不偿失