|
|
发表于 2007-8-21 01:13:00
|
显示全部楼层
Re:关于directx渲染系统设计方案的思考
考虑的不错,给你加几点:
1. 每个material的id 最好用一个 64位 unsigned int 表示。当然如果你用 128位 unsigned int, 使用__mm128关键字, 也可以。这样可以相对减少排序复杂度。
2. 对于游戏里所有的texture和effect,最好分别有个 texture manager和effect manager, 对于相同的texture和effect,给一个相同的 id: 分别是 texture id 和 effect id。 每个id是个8位的 byte就足够了。同时支持256个effect和texture在内存中差不多是极限。
3. 关于material 的 id, 还需要包含物体的一些信息和到camera的距离,一般来说, 大概的定义如下:
union{
struct {
unsigned int objectType : 8;
unsigned int effectID : 8;
unsigned int textureStage1 : 8;
unsigned int textureStage2 : 8;
unsigned int textureStage3 : 8;
unsigned int textureStage4 : 8;
unsigned int distanceToCamera : 8;
unsigned int renderstate : 8;
}
unsigned __int64 matId;
}
上面的结构只支持4个texturestage,如果你要支持更多,可以适当的修改。
里边的objectType可以用来区分opaque, transparent 和 hud. 比如opaque 的id 是 1000, transparent是 0100, hud是 0010, 这样排序时候可以保证是先渲染 opaque, 然后transparent,然后是hud.
对于effect 和 texture 哪个放在前面,主要是看哪种资源更换的更频繁。这个需要你具体测试才知道。关于距离的问题,对于opaque,需要做位反操作,因为是从近到远排序。 同时对于transparent的物体,distance可能要和effect或者texture stage 1的位置换以下,因为从远到近排序更重要一些。
还有对于material的内部const value或者render state排列,很多时候是在build time进行的。当然怎么做最后还是你自己决定。
4. 还有看来你目前只考虑了material的系统。也可以算是effect system. 但是effect system的话还是缺少 post effect 的支持。 其次是光靠这里排序是不够的,因为很多effect内部可以改变render states. 因此你还需要增加一个effect states manager,DX里边就有这个, 你用 effect state manager搜下dx文档就知道了。具体结构可以参考 shader X4里边 "tips and tricks for d3dx effects-based renderers".
5. 最后,如果没有scene management, 和 scene graph, 还不能算是完整的render system. |
|