蔡军生先生第二人生的源码分析(十七)人物Mesh数据显示的实现

前面介绍了怎么样读取人物的Mesh数据,那么你也许会想到,读取数据之后是怎么样显示出来的呢?并且显示出活生活现的人物来。现在就来分析第二生里怎么样显示人物Mesh数据,它的显示流程如下:

1、 LLAppViewer::mainLoop()  主线程的消息循环函数。

2、 display() 主要渲染函数。

3、 LLPipeline::renderGeom() 渲染管道显示函数。

4、 LLDrawPoolAvatar::render() 人物缓冲池渲染函数。

5、 LLDrawPoolAvatar::renderAvatars() 渲染所有人物。

6、 LLVOAvatar::renderSkinned() 每个人物渲染显示。

7、 LLVOAvatar::renderTransparent() 每个人物渲染透明部份数据。

8、 LLViewerJoint::render() 每个人物的每个部份渲染显示。

9、 LLViewerJointMesh::drawShape()  每个部份渲染外状。

10、   llDrawRangeElements()  这个函数渲染每个三角显示。

 

先看一下llDrawRangeElements()函数里怎么调用OPENGL函数来显示人物角色的Mesh数据,代码如下:

#001  void llDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices)

#002  {

#003       if (end-start+1 > (U32) gGLManager.mGLMaxVertexRange ||

#004              count > gGLManager.mGLMaxIndexRange)

#005       {

#006              glDrawElements(mode,count,type,indices);

#007       }

#008       else

#009       {

#010              glDrawRangeElements(mode,start,end,count,type,indices);

#011       }

#012  }

 

glDrawElementsOpenGL基本的图元显示函数,它的定义如下:

WINGDIAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);

mode是显示的方式,比如三角形、三角形列表等等。

count是图元的个数。

type是索引点的数据类型。

indices是索引数组。

 

glDrawRangeElementsOpenGL基本的图元显示函数扩展函数。它的定义如下:

GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *);

这个函数跟上面函数的参数不同之处,就是可以设置索引数组里的起点位置和结束位置。

蔡军生先生第二人生的源码分析(十七)人物Mesh数据显示的实现_第1张图片

蔡军生  2008/01/17 QQ:9073204 深圳

你可能感兴趣的:(生活,qq,扩展)