第二人生的源码分析(十九)人物组合显示

来源:互联网 发布:网络大电影有哪些 编辑:程序博客网 时间:2024/04/28 09:41
在第二人生里,人物的显示是比较复杂的,因为同一个网格模型可以显示为不同的人物出来,也就是人物每个部位的纹理不一样,比如不同的女孩子就有可能选择不同的头发,还可以穿着不同的衣服,不同的裤子等等。要实现这些功能,也就是说要把头、上身、下身、脚分开来显示。如下图所示:
蔡军生 2008/01/22 QQ:9073204 深圳
 
现在就来仔细地分析一下第二人生里是怎么样分别显示不同身体部份的,它的代码如下:
#001 U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
#002 {
#003      U32 num_indices = 0;
#004 
#005      if (!mIsBuilt)
#006      {
#007             return num_indices;
#008      }
#009 
……
……
#077      //--------------------------------------------------------------------
#078      // render all geomety attached to the skeleton
#079      //--------------------------------------------------------------------
#080      static LLStat render_stat;
#081 
#082      LLViewerJointMesh::sRenderPass = pass;
#083 
 
这里开始显示人物的各部位网格和纹理。
#084      if (pass == AVATAR_RENDER_PASS_SINGLE)
#085      {
#086             BOOL first_pass = TRUE;
#087             if (!mIsSelf || gAgent.needsRenderHead())
#088             {
#089                    num_indices += mHeadLOD.render(mAdjustedPixelArea);
#090                    first_pass = FALSE;
#091             }
上面显示头部。
 
#092             num_indices += mUpperBodyLOD.render(mAdjustedPixelArea, first_pass);
上面显示上身。
 
#093             num_indices += mLowerBodyLOD.render(mAdjustedPixelArea, FALSE);
上面显示下半身。
 
#094 
#095             {
#096                    LLGLEnable blend(GL_BLEND);
#097                    LLGLEnable test(GL_ALPHA_TEST);
#098                    num_indices += renderTransparent();
上面调用函数renderTransparent显示头发、裙子。
 
#099             }
#100      }
 
这样分开显示的好处,就是可以显示各种各样的人物出来,多姿多彩,节省人物实现的数据下载,当然也是骨骼动画实现的需要。