前面介绍了怎么样读取人物的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 }
glDrawElements是OpenGL基本的图元显示函数,它的定义如下:
WINGDIAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
mode是显示的方式,比如三角形、三角形列表等等。
count是图元的个数。
type是索引点的数据类型。
indices是索引数组。
glDrawRangeElements是OpenGL基本的图元显示函数扩展函数。它的定义如下:
GLAPI void APIENTRY glDrawRangeElements (GLenum, GLuint, GLuint, GLsizei, GLenum, const GLvoid *);
这个函数跟上面函数的参数不同之处,就是可以设置索引数组里的起点位置和结束位置。
蔡军生 2008/01/17 QQ:9073204 深圳