游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3051|回复: 9

请教大侠们,关于换装系统

[复制链接]

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2007-8-7 00:20:00 | 显示全部楼层 |阅读模式
RT,当人物在身穿各种衣物的时候,同一个人将会有好几张贴图和多种渲染状态,但是却只有一副骨骼。
而在一个场景中有几十个人的时候,其中会有很多贴图和渲染状态相同的Mesh模块,但却在不同的人物身上。
    我的问题是:在这样的情况下,使用下列哪种方法渲染比较好?
1、将一个人物分几个批次,渲染完了一个人,再去渲染其他人。
2、按照贴图或渲染状态分类批次,将所有相同贴图或状态相同的身体部分做一个批次渲染。
3、先按照骨骼分类,再在同类骨骼的人物中按第2种方法分类。

更换贴图和渲染状态会很频繁,批次也比较多,这是方法1的缺点。
由于骨骼动画用的是VertexShader,所以更换骨骼将会影响效率。这是方法2的缺点。
如果要实现方法3,则需要将骨骼的所有动画信息保存在贴图中,在VertexShader中读取,且顶点信息中还需要保存一个BYTE来辨别一个顶点到底被哪一组的矩阵变换。这样需要SM3,且在VS中读取贴图信息的效率不得保证,不会很通用的。

小弟才疏学浅,只能想到这3种方法,且都很不实用,同时求更好的实现思路,
所以发帖请教高人,望不吝赐教 [em10] [em10] [em10]

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-8-7 09:35:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

把部位分开.所有的部位纹理都用一个ID标拾.用hash_map 装载ID对应的纹理路径.你可以一开始把所有部分纹理加载到内存或者显卡里面,做个纹理管理,如果有的直接个他纹理IDirect3DTexture9* 没有在加载.你看魔兽他不是一见到人哪个人可能裸体吗?就是在查找纹理.在加载.也就是你的装备能装几个你的模型可是就要分几个.当然纹理UV要一样.
还有一个方法,就是人物默认都有一个蒙皮的.你还是要把各部位纹理分开.加载和某部位一样大的纹理把他压到你的蒙皮哪个纹理上

8

主题

390

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-8-7 11:43:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

兄台的想法可以认为是过度优化,没有方案是完美的。
其实完全不需要管换装不换装,你的渲染系统负责对提交的准备渲染的物体进行排序,降低状态切换成本。
一般的经验是,1:同一纹理dp操作的紧挨着一起提交;然后再是2:同一vertex shader 一起提交。然后再3:同一Vertex buffer,或者indices buffer。
//其他的一些状态切换影响不大,也很难避免,让cpu去排序也很累,不如不管算了。

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
 楼主| 发表于 2007-8-7 16:02:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

谢谢两位的回复,我对OSFG兄的第2种方法很感兴趣,如果我没理解错的话,是不是说,将一个人物的纹理用一张图,然后在程序中写这张图,把所有部位的贴图都放在这张图上,且位置固定呢?

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
 楼主| 发表于 2007-8-7 16:10:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

ReallyBigBug兄说的是很对,但如果骨骼动画是用VS实现的,那么按照贴图分类的话,对GP常量寄存器中的矩阵就要更新比较频繁了。不知道这比之更换贴图,哪个更影响效率。
归根究底,我其实就是搞不明白影响效率的因素哪个占的更大:
我目前认为的是: 贴图更换 > VS更换 > DP调用 > GPU常量上传 > VB的Lock
不知道对不对??

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-8-7 19:31:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

换贴图怎么会影响速度呢?除非你实在是罕见的装备,不然一般都是提前加载的.换个指针没什么慢的吧~

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
 楼主| 发表于 2007-8-9 22:29:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

回楼上,纹理并非都是保存在显存中的,很多纹理都保存在内存里,每次还要上传到显卡中,所以很慢的说......

29

主题

405

帖子

405

积分

中级会员

Rank: 3Rank: 3

积分
405
发表于 2007-8-10 23:32:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

楼主的标题和内容好象不大符合呀.
渲染优化和换装有什么关系呢?
就算是渲染,那和骨骼有什么关系呢?

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2007-8-11 21:18:00 | 显示全部楼层

Re: 请教大侠们,关于换装系统

这个题目很有趣。
首先如果你的纹理真的多到显存装不下,那你的速度也快不到哪去,这是肯定的。
不过此时以纹理优先是很有说服力的。
排除掉这个情况
切换vbuffer(已经在现存),切换贴图(已经在现存),都不过是切指针而已,切指针那不是非常快么,能有什么影响?
唯一的影响就是切断了渲染流水线,使得在此期间显卡无事可做。
同样,切换渲染状态也是一样。
所以,最终的目标不过是尽量减少切断流水线的次数。
然而这样的优化应该很困难,而且很容易就变成过分优化。
现实是我们总是有很多奇奇怪怪的修改不断添加进来。
所以,最好的方法大概是没有,最适合的方法或者是有,各位好自为之就对了。

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
 楼主| 发表于 2007-8-11 22:52:00 | 显示全部楼层

Re:请教大侠们,关于换装系统

回8楼!的确有点不合适呵呵,当时正在想换装系统的优化,就想到渲染优化上了,于是浑浑噩噩的起了个标题名字。至于骨骼,那是因为骨骼关系到vs的变更。骨骼动画我是用vs实现的。同时牵涉到实例渲染,于是就出现这些问题。
谢谢9楼的回复,我似乎明白了该怎么做,但好像还是有点迷茫。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 11:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表