对于render system的一点思考(里面关于材质的ID很有启发)

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里边就有这个. 具体结构可以参考 shader X4里边 "tips and tricks for d3dx effects-based renderers". 5. 最后,如果没有scene management, 和 scene graph, 还不能算是完整的render system.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值