为了研究 portal 渲染技术,下载了 quake3 的源代码,上午看了一下 Renderer 的渲染流程,在这里简单描述一下。 说明: 1.主要流程都集中在 Renderer 工程中。 2.按照调用顺序说明,这里只是给出关键的函数调用。 3.只是描述了一般渲染流程,对于其他渲染方式没有描述。 4.只对表面渲染流程进行了说明。 5.不包括纹理设置、纹理坐标、雾、光照等设置的说明。 一、 函数调用流程 调用顺序 函数名称 函数说明 所在源文件 1 RE_EndFrame 执行当前祯的渲染 Tr_cmds.c 2 R_IssueRenderCommands 触发渲染命令 Tr_cmds.c 3 RB_ExecuteRenderCommands 执行渲染命令 Tr_backEnd.c 4 RB_DrawSurfs 渲染表面 Tr_backEnd.c 5 RB_RenderDrawSurfList 对待渲染表面进行排序,按照分类进行渲染 Tr_backEnd.c 6 RB_BeginSurface 初始化当前渲染命令参数 Tr_shade.c 7 RB_SurfaceFace 将当前表面的顶点数据、顶点索引、法线、纹理坐标加入当前渲染命令中 Tr_surface.c 8 RB_EndSurface 根据渲染命令渲染表面 Tr_shade.c 9 RB_StageIteratorGeneric 根据渲染命令参数设置ogl渲染参数,顶点、纹理、颜色等 Tr_shade.c 10 RB_IterateStagesGeneric 根据渲染命令pass进行渲染 Tr_shade.c 11 R_DrawElements 渲染三角形带 Tr_shade.c 二、 流程说明: 和大多数3D引擎一样,quake3对待渲染的图元首先进行分类,按照着色器(shader) 索引、渲染实体数量、雾索引、动态光索引排序,需要说明的是,这里将上述几项合并到一个32位整数,这会大大加快图元排序。排序使用二分算法,在ms的qsort上作了修改。 为了减少绘制次数,quake3在每次渲染前将待渲染图元的顶点数据送入到缓冲区中,并设置相应的顶点索引,由于每个渲染表面的顶点索引是局部索引,所以很容易与其它表面合并为一个索引缓冲区,这样就可以批量绘制同一渲染状态的图元。 以上只是非常简单的说明,具体的代码中要更复杂,但大体流程如此,如有错误,恳请指正。 |