面向对象三维图形引擎的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第39卷 第1期 电 子 科 技 大 学 学 报 V ol.39 No.1
2010年1月 Journal
of University of Electronic Science and Technology of China Jan. 2010 面向对象三维图形引擎的设计与实现
邱 航,陈雷霆
(电子科技大学计算机科学与工程学院 成都 610054)
【摘要】提出并实现了一种面向对象的三维图形渲染引擎Gingko ,对引擎的体系结构、各模块之间的关系以及关键技术进行了分析说明。该引擎提供可扩展的软件体系结构、高效的场景处理方法、方便易用的应用程序接口,为三维图形应用的快速开发和高效运行提供了支撑。实验证明,该引擎具有运行稳定、渲染速度快的特点,对于大规模室外场景的渲染速度能保持在20 fps 以上。
关 键 词 图形引擎; 插件; 实时渲染; 真实感渲染
中图分类号 TP391.41 文献标识码 A doi:10.3969/j.issn.1001-0548.2010.01.028
Design and Implementation of Object-Oriented 3D Graphics Engine
QIU Hang and CHEN Lei-ting
(School of Computer Science and Engineering, University of Electronic Science and Technology of China Chengdu 610054)
Abstract An object-oriented 3D graphics engine is presented and implemented. The general architecture, the relationships of every module, and the key techniques of the engine are discussed. This engine can support extendable software architectures, and provide high efficient scene rendering method and convenient application programming interfaces. It can greatly accelerate the development of 3D graphics and provide supports for its efficient running. Experimental results show that this engine has high stability and high rendering speed, for rendering large-scale out-door scene, the speed is still above 20 fps.
Key words graphics engine; plug-in; real time rendering; realistic rendering
收稿日期:2008 − 06 − 25; 修回日期:2009 − 04 − 28
基金项目:国家863高技术研究发展计划项目(2006AA01Z335);总装“十一五”预研项目
作者简介:邱 航(1978 − ),男,在职博士生,讲师,主要从事计算机图形学、数字媒体技术方面的研究.
实时真实感图形生成是计算机科学技术的重要
研究方向,目标是使计算机可以产生与真实世界相
同或高度近似的视觉环境,从而使用户获得身临其
境的视觉感受[1-2],其应用范围覆盖大众娱乐、视景
仿真、城市规划及文化教育等诸多领域。
近年来,随着计算机图形软、硬件的不断发展,
人们对实时真实感渲染以及场景复杂度提出了更高
的要求。传统的直接使用底层图形接口如OpenGL 、
DirectX 开发图形应用的模式越来越暴露出开发复
杂性大、周期长、维护困难的缺陷。鉴于以上原因,
三维图形引擎相关技术受到了广泛的关注。目前,
国外已有众多商用或开源三维图形引擎,如
OGRE [3]、OSG [4]等。
OGRE(object-oriented graphics rendering engine)
是一种用C++实现的跨平台开源三维图形引擎。该
引擎底层对DirectX 、OpenGL 进行完全封装,采用
了基于插件的体系结构,方便用户使用和功能扩展。
但OGRE 过于庞大和复杂,使用户感觉掌握困难。此外,由于底层对DirectX 和OpenGL 的完全封装,用户无法对基本图形API 进行直接操作。 OSG(open scene graph)是一款著名的3D 图形引擎,主要用于虚拟现实、仿真和游戏等领域。OSG 底层只提供了对OpenGL 的封装,与其他图形引擎一样,拥有诸如场景管理、地形管理和底层API 封装等功能。但OSG 的渲染管理比较特殊,它不是采用渲染队列进行渲染管理,而是采用渲染树,更为高效。 Irrlicht 引擎是一款开源、跨平台的3D 引擎,底层封装了DirectX 和OpenGL ,并提供基于GLSL 和HLSL 的可编程渲染管道。该引擎结构简单、速度快。但Irrlicht 以牺牲渲染质量达到高速的目的,在光照等真实感方面比较薄弱。 纵观目前国内外三维图形引擎的发展格局,开发具有自主知识产权、融入新方法、新技术的三维图形引擎是我国在信息技术领域的一项重要目标。 本文提出并实现了一种面向对象的三维图形引擎Gingko ,该引擎不仅能提高用户的开发速度,而
电子科技大学学报第39卷124
且能使用户方便地将自己新的算法融入到应用中。1三维图形引擎Gingko
三维图形引擎Gingko是一个面向视景仿真、数字展示、游戏等应用的软件支撑环境。其体系结构如图1所示。
图1 三维图形引擎Gingko体系结构
在结构上,Gingko分为渲染语言封装层、核心层、扩展层以及用户接口层等4层。
渲染语言封装层:Gingko建立在底层绘制接口之上,渲染语言封装层封装了底层图形接口OpenGL、DirectX9的所有绘制属性。与OGRE、OSG 和Irrlicht等引擎不同,Gingko对底层绘制接口的封装是一种半封闭式封装,即用户既可以通过调用Gingko提供的API实现绘制,也可以直接调用底层绘制接口。
核心层:包含引擎的主渲染框架、场景管理、渲染管理、插件管理、资源管理、消息系统等。
扩展层:包含时钟管理、用户GUI、脚本系统以及其他组件。
用户接口层:为上层用户提供统一的API。1.1 核心层主要组件分析
1.1.1 主框架
主框架是整个图形引擎的骨架,它决定着渲染流程的走向以及其他功能模块之间的耦合形式。此外,它还负责底层细节的屏蔽、渲染流程的结构化和标准化等重要功能。
在Gingko中,主框架的结构在逻辑上分为上、中、下3层。
(1) 上层为友好的用户接口,主要负责对外提供API函数集,满足用户的各种功能需求,实现用户和图形引擎的交互。各种功能需求包括引擎的启动、资源的加载、场景的搭建、场景的渲染、场景的更改、资源的释放以及引擎的停止。
(2) 中层为引擎各模块连接核心,负责处理主框架和其他模块的相互联系和协作。
(3) 下层为底层封装,图形引擎的底层系统主要指基础图形API函数集和操作系统两大部分。对图形引擎而言,操作系统相关的函数调用比较固定,其封装的方法也比较成熟。对基础图形API的封装,OGRE、OSG等采用彻底封装的方式,即仅仅使用插件系统完成封装模块的更新和扩展,对用户完全透明,用户不会接触到关于OpenGL或DirectX等基础图形API的任何细节。随着计算机图形学的发展和图形应用软件的复杂化,只能依靠插件系统进行扩展和更新的封装方式的缺点日益显著。开发人员在使用引擎进行开发的过程中往往会产生许多重要但细微的功能扩展需求,为了这些细微的扩展需求编写插件更新主框架,必将对开发周期和开发成本带来冲击。此外,随着计算机软、硬件的发展,人们对图形应用软件中的渲染效果、光影、特效等的需求越来越高,然而大多数特效的实现需要以特定的序列调用特定的基础图形API函数,引擎完全透明性的下层系统已经在很多方面妨碍了高级的图形特效的开发。针对完全封装方式的缺点,Gingko采用半封闭式封装方式,在屏蔽底层系统繁琐细节的同时,也允许高级用户直接接触OpenGL、DirectX等强大的图形API函数。
1.1.2 场景管理
Gingko的场景管理主要包含场景节点组织、场景分割和地形管理,通过场景树的形式组织场景内的各个元素。场景树的各个节点之间的父子关系对应场景内元素的逻辑关系,如一片建筑区域和建筑区域内的各个建筑在场景中表现为父节点和子节点的关系。Gingko在设计上基于插件的开放式方式,场景分割和地形管理模块都可以通过插件系统配置不同的分割和管理策略。Gingko默认提供了基于八叉树和BSP树[5]的场景分割,以及基于ROAM[6]算法的地形调度。
1.1.3 渲染管理
渲染管理主要控制场景渲染,包括Pass和Effect 两个重要概念,如图2所示。(1) Pass是一个渲染遍即一次渲染的自然表示。Pass主要由数据源、渲染状态、纹理对象、Shader(可编程Pass专有)和输出对象构成。Pass按照使用固定管线和可编程管线的不同