精华内容
下载资源
问答
  • 一个优秀的3D图形图像引擎,3D,ui界面,实时渲染。代码完整。可供引擎参考学习等用。Tranquillity_1.3
  • 在实时渲染的图形开发中,着色器代码...Bgfx 是一款跨平台、抽象封装了众多主流图形 API 的优秀渲染引擎。作为示例,本文在 Windows 平台上演示使用 Microsoft Visual Studio* 和 RenderDoc 对 Bgfx 中的 DX11 着...

    在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求。使用调试工具进行调试,成为开发中重要的方法。
    Bgfx 是一款跨平台、抽象封装了众多主流图形 API 的优秀渲染引擎。作为示例,本文在 Windows 平台上演示使用 Microsoft Visual Studio* 和 RenderDoc 对 Bgfx 中的 DX11 着色器代码进行调试。阅读详情

    展开全文
  • 1 、引言随着计算机可视化、虚拟现实技术的飞速发展,人们对...为此国外出现了许多优秀的三维渲染引擎,比如Delta3D,OGRE,OSG,Unity3d,VTK等。渲染引擎的作用是要优化遍历和显示三维模型。本文主要对OGRE与OSG...

    1 、引言
    随着计算机可视化、虚拟现实技术的飞速发展,人们对实时真
    实感渲染以及场景复杂度提出了更高的要求。传统的直接使用底层
    图形接口如OpenGL、DirectX开发图形应用的模式越来越暴露出开
    发复杂性大、周期性长、维护困难的缺陷。为此国外出现了许多优秀
    的三维渲染引擎,比如Delta3D,OGRE,OSG,Unity3d,VTK等。渲
    染引擎的作用是要优化遍历和显示三维模型。本文主要对OGRE与
    OSG这两个三维图形渲染引擎做个简单的比较,介绍他们在运行效
    率、场景管理、功能支持、可扩展性等方面的异同。通过了解两者差
    异后,可以根据不同的项目需求,选择合适的渲染引擎。
    2、OGRE 与 OSG 渲染引擎简介及特性
    2.1 OGRE
    OGRE(Object-Oriented Graphics Rendering Engine)即:
    面向对象图形渲染引擎,是一个用C++开发的面向场景、非常灵活
    的3D引擎,诞生于1999年。它旨在让开发人员更容易、更直接地利
    用硬件加速的3D图形系统开发应用。这个类库隐藏了底层系统库
    Direct3D和OpenGL的所有细节,并支持多种高级特性,提供了一个
    基于现实世界对象和其他直观类的接口。目前官网中OGRE的最新
    版本为1.7.3。
    OGRE几乎拥有了商业3D渲染引擎的全部特性,甚至有些方面
    超越了它们
    [2]
    :(1)自动处理渲染状态和空间剪裁;(2)支持所有纹理
    混合和绑定技术,同时支持对GPU编程技术,支持汇编语言和所有
    高级语言形式的各种着色语言,其中高级语言包括:Cg,HLSL和
    GLSL;(3)强大且成熟的材质管理和脚本系统,可以不动一行代码去
    进行材质维护;(4)支持多种纹理图片格式,包括:PNG,TGA,DDS,
    TIF,GIF,JPG,同时支持特殊格式的纹理;(5)全面支持对顶点和索
    引缓存(vertex and index buffers)、顶点声明(vertex declarations)
    以及贴图缓存(buffer mappings);(6)给出以插件方式链接不同场
    景结构的接口,允许你使用适合自己应用程序的场景体系;(7)成熟
    且可扩展的资源管理和载入系统,文件系统支持的文件包括zip,
    pk3格式等等。
    2.2 OSG
    OSG(OpenSceneGraph)是一个高性能的开源三维图形引擎,
    是一个开放源码,跨平台的图形开发包,它为诸如飞行器仿真,虚拟
    现实,科学计算可视化这样的高性能图形应用程序开发而设计。它
    基于场景图的概念,它提供一个封装了OpenGL底层细节的面向对
    象的框架,从而能把开发者从实现和优化底层图形的调用中解脱出
    来,并且它为图形应用程序的快速开发提供很多附加的实用工具。
    OSG大概诞生于1997年,发展至今其功能特性涵盖了大规模场景的
    分页支持,多线程、多显示的渲染,粒子系统与阴影,各种文件格式
    的支持。目前官网的稳定版本为3.0.1。
    OSG的引擎特性:
    2.2.1 场景图
    OSG让所有的人在场景图技术中受益,无论是商业还是非商业
    的用户,达到工业级的标准;方便了图形图象数据的保存;高性能高
    效率;支持视图投影剔除(view frustum culling),隐藏面剔除
    (occlusion culling),小特性剔除(small feature culling),细节层
    次节点(LOD),状态排序(state sorting),顶点数组,顶点缓冲对象
    (vertex buffer objects),OpenGL着色语言和显示列表(display
    lists),以上所列都是场景图内核的一部分。它们共同使OSG成为一
    个高性能的图形库变为可能。OSG也支持绘制进程(drawing
    process)的定制,比如场景图的连续细节层次(CLOD)的网格。
    2.2.2 使用了自动记数功能
    OSG中使用了智能指针的使用,使得开发人员脱离了繁重的内
    存分配与释放的工作;减少了由于人为的原因造成的内存泄露的状
    况。
    2.2.3 快速开发
    场景图的内核封装了包括最新扩展的大部分OpenGL底层功
    能,提供诸如剔除和排序的渲染优化功能,同样提供能快速开发高
    性能图形应用程序的一整套补充库,开发者可以更快地掌握实质性
    内容和如何操控这些它们,而不再是底层的代码。
    2.2.4 强大的可扩展性、移植性、伸缩性
    开发人员可以根据自己的实际需要,对程序做一些必要的扩
    展;如读取插件,可以根据自己的要求与需要编写自己的文件格式
    读写器;也可以修改内核增加新的节点满足自己的需求;OSG的完
    全独立与窗口操作系统的场景图内核库使得用户在它上面可以增
    加他们自己的指定窗口库和应用程序,在发布版本中osgViewer库
    提供自带窗口支持,可支持Windows(Win32),Unices(X11)和OSX
    (Carbon)。
    2.2.5 OSG 提供功能强大的模块,主要包括四个库
    [3]
    (1)OSG核心库(Core Library),主要功能是实现最核心的场
    景数据库的组织和管理、对场景图形的操作以及为外部数据库的导
    入提供和接口。主要包括的库有:osg,用来OSG的内核模块,主要为
    管理数据的类型与节点;osgDB,用来管理场景数据的读取与保存,
    以及插件的管理等等。
    (2)OSG工具库(NodeKit),是对OSG核心库的一个补充,实现了
    一定特定的功能。比如:
    osgFX,用于渲染特效节点;osgParticle,提供了OSG对粒子系
    统的支持,如雨、雪、爆炸模拟等;osgTerrain,提供OSG对地形的支
    持,用于渲染高程数据(TIF、DEM等高程数据格式)等等。
    (3)OSG插件库。OSG插件库是OSG一个非常重要的特点。为了
    读入和写出数据库,OSG提供了许多动态的插件从来支持其他软件
    创建的3D或2D的数据格式:
    支持的2D的文件格式有:bmp,jpg,png,pnm,tif,gif,jp2,pic,
    svg,tga,rgb,txf,dd(s包含压缩的一系列Mip贴图影像),基于字体
    的图像也可以通过.txf插件支持等;
    LightWave(.lwo),Alias Wavefront(.obj),OpenFlight(.flt),In-
    ventor Ascii 2.0 (.iv)/VRML 1.0 (.wrl),Designer Workshop
    (.dw),AC3D(.ac)和本地ASCII文本格式(.osg)和本地二进制格式
    (.ive)及.osga压缩包格式,等等。
    (4)OSG内省库(osgIntrospection)
    OSG内省库提供了一个与语言无关的程序接口,确保了OSG可
    以在更多的环境下运行。

     

     

     

    1   前言 

    我曾经细致阅读过 OGRE 和 OSG 官方提供的文档,有《Pro OGRE 3D Programming》、OGRE自带手册(manual)、王锐老师等翻译的《OpenSceneGraph  Quick  Guide》,同时在网络上查阅了大量的 OGRE 架构源码分析的文章。简单使用过 OSG,对 OSG 的场景管理器设计和编程风格有所了解,而在近期的项目中大量使用 OGRE,相对于 OSG,对 OGRE 的认识比较深刻一些。目前 OGRE 的最新版本是 1.7,OSG 的最新版本是 2.9.7。 

    本文是对 OGRE 和 OSG 这两大三维图形绘制引擎的一个不全面的个人比较,主要简单介绍它们在运行效率、平台支持、资源管理、场景树管理、功能支持、可扩展性、易用性和相关支持方面的异同,而不是评论谁优谁劣(当然本人也没这资历),通过了解差异后,根

    据不同项目要求做出不同选择。 

    因为本人使用这两个绘制引擎的时间不长、运用的功能特性也不全,所以有些比较结论可能不合理,欢迎指正,通过交流,共同进步。 

    2   绘制引擎简介 

    2.1  OGRE 

    OGRE 是 Object-Oriented Graphics Rendering Engine(面向对象的图形绘制引擎)的简称,是一个用 C++开发的面向对象且使用灵活的 3D 引擎,是一个被广泛使用的开源三维图形渲染库。它成功地被应用于诸多三维仿真领域,其中包括网络游戏和一些商业的三维仿真项目。

    它的目的是让开发者能更方便和直接地开发基于 3D 硬件设备的应用程序或游戏。引擎中的类库对更底层的系统库(如:Direct3D 和 OpenGL)的全部使用细节进行了抽象,并提供了基于现实世界对象的接口和其它类。OGRE 的主要特性有: 

    效率特性 

         简单、易用的面向对象接口设计使你能更容易地渲染 3D 场景,并使你的实现产品独立于渲染 API(如 Direct3D、OpenGL、Glide 等等)。 

         可扩展的程序框架(framework)使你能更快的编写出更好的程序。 

         为了节省你的宝贵时间,OGRE 会自动处理常见的需求,如渲染状态管理,空间裁剪,半透物体排序等等。 

         清晰、整洁的设计加上全面的文档支持。 

         在很多商业产品(特别是电子游戏)上得到应用,并被证实是一个稳定的引擎。 

    平台和 3D API 支持 

         支持 Direct3D 和 OpenGL。 

         多平台支持,支持 Windows(所有版本)、Linux 和 Mac OSX。 

         在 Windows 平台上可以使用 Visual C++或 Code::Blocks 编译。 

         在 Linux 平台和 Mac OSX 平台(使用 XCode)上可以使用 gcc 3+编译。 

    材质、Shader 支持 

         强大的材质声明语言使你可以在代码之外维护材质资源。 

         支持顶点和像素着色器(Shader),同时支持低级的汇编着色器和高级的着色器,如Cg、D3D 中的 HLSL 和 GLSL,并为许多常用的常量提供自动的绑定的,如世界视点矩阵、光照状态、视点世界坐标等。 

         支持固定渲染管线的全部功能,如多纹理、多遍绘制融合、纹理坐标生成和修改、为低端的不可编程显卡提供独立的颜色融合操作。 

         支持多个材质技术,你可以设计不同显卡配置的不同技术,OGRE 自动选择最佳的技术。 

         支持材质的 LOD;你的材质可以在它们远离视点时减少资源消耗。 

         支持从 PNG、JPEG、TGA、BMP 或 DDS 等文件中加载纹理;支持不常见的 1D 纹理、立体纹理、立体盒纹理和压缩纹理(DXT、S3TC)。 

         可以通过插件实时提供及更新纹理,如从视频上。 

         支持透射纹理映射(Projective Texturing)。 

    网格 Meshes 

         灵活的网格数据格式支持,独立于顶点缓存、序号缓存、顶点声明和缓存映射。 

         支持渐进的网格 LOD,可以自动或手动生成。 

         支持用 Bézier 样条实现的曲面。 

         静态几何分批绘制。 

    动画 

         支持复杂的骨骼动画 

         灵活的形状动画支持 

         支持场景节点动画,并提供样条插值 

         普通动画路径支持可插入的物体适配器(不是很清楚,详见官网说明) 

    场景特性 

         拥有高效率和高度可配置性的场景管理器,并且支持多种场景类型。使用系统默认的场

    景组织方法,或通过亲自编写插件使用自己的场景组织方法。 

         提供的 BspSceneManager 插件是快速的室内渲染器,它支持加载 Quake3 关卡和 shader脚本分析。 

         多等级的场景组织体系;场景结点支持物体的附属(attach),并带动附属物体一起运动,实现了类似于关节的运动继承体系。 

    特效 

         粒子系统包括可以通过编写插件来扩展的粒子发射器(emitter)和粒子特效影响器(affector)。通过脚本语言可以不用重新编译就设置和更改粒子属性。支持并自动管理粒子池,从而提升粒子系统  的性能。 

         支持天空盒、天空面和天空圆顶,使用非常简单。   

         支持公告板,以实现特效。 

         自动管理透明物体(系统自动帮你设置渲染顺序和深度缓冲) 

    其它特性 

         资源管理和文档加载(ZIP、PK3)。 

         支持高效的插件体系结构,它允许你不重新编译就扩展引擎的功能。 

         运用“Controllers”你可以方便地改变一个数值。例如通过生命值动态改变一个飞船的防护罩的颜色值。 

         支持内存泄露检测的内存调试管理器 

         通过 ReferenceAppLayer 例程了解如何让 OGRE 与其它库协同工作,如做碰撞可信度的ODE 库。 

         可以用 XMLConverter 让二进制格式文件与 XML 相互转换,方便交流和编辑。 

    2.2  OSG 

    OSG 是 OpenSceneGraph 的简称,是一个开放源码、跨平台的图形开发包。它为诸如飞行器仿真,游戏,虚拟现实,科学计算可视化这样的高性能图形应用程序开发而设计。它基于场景图的 概念,它提供一个在 OpenGL 之上的面向对象的框架,从而能把开发者从实现和

    优化底层图形的调用中解脱出来,并且它为图形应用程序的快速开发提供很多附加的实用工具。  

    它完全是由标准 C++程序和  OpenGL 写的,充分利用 STL 和设计模式,发挥开源开发模型的优势来提供一个免费的开发库,并且重点集中在用户的需求上。随着使用一个全特性的场景图  OpenSceneGraph  的关键优势在于它的性能、可扩展性、可移植性和快速开发

    (productivity),更具体的来说: 

    性能 

    支持视图投影剔除(view frustum culling)、隐藏面剔除(occlusion culling)、小特性剔除(small feature culling)、细节层次节点(LOD)、OpenGL 状态排序(state sorting)、顶点数组、顶点缓冲对象(vertex buffer objects)、OpenGL 着色语言和把显示列表(display lists)作为场景图内核的一部分。它们共同使 OpenSceneGraph 成为一个高性能的图形库。OpenSceneGraph

    也支持绘制流程(drawing process)的定制,比如场景图的连续细节层次(CLOD)的网格(参见虚拟地形项目和 Delta3D)。 

     

    快速开发 

    场景图的内核封装了包括最新扩展的大部分 OpenGL 功能,提供诸如剔除和排序的渲染优化功能,同样提供能快速开发高性能图形应用程序的一整套补充库。应用程序开发者可以更关心实质性内容和如何操控这些它 们,而不再是底层的代码通过学习已有的场景图,比如:Performer 和 Open Inventor,把它们同像设计模式这样现代软件工程理念联合起来,加上早期开发周期中的大量反馈信息,设计一个清晰的可扩展的库已经成为可能。用户可 以很简单的适应 OpenSceneGraph 并且把它集成到自己的应用程序中 

     

    数据装载 

    为了读入和写出数据库,数据库支持库(osgDB)支持动态的插件机制,从而支持大量数据格式,目前的发布版本有 55 种单独的插件支持 3D 数据和图像格式的装载。 

    支持的 3D 数据格式包括 COLLADA、LightWave (.lwo)、Alias Wavefront (.obj)、OpenFlight (.flt),多线程页面调度支持的 TerraPage  (.txp)、Carbon  Graphics  GEO  (.geo)、3D  Studio  MAX (.3ds)、Peformer (.pfb)、AutoCAd (.dxf)、Quake Character Models (.md2)、Direct X (.x)和 Inventor Ascii 2.0 (.iv)/ VRML 1.0 (.wrl)、Designer Workshop (.dw)、AC3D (.ac)  和自带的.osg ASCII  文本格式。 

    支持的图像格式包 括.rgb、.gif、.jpg、.png、.tiff、.pic、.bmp、.dds  (包含压缩的一系列Mip 贴图影像)、.tga  和 quicktime  (在 OSX 环境下),全范围的高质量、抗锯齿字体也能通过freetype 插件支持,基于字体的图像也可以通过.txf 插件支持。 

    用户也可以通过与一个同盟项目(VirtualPlanetBuilder)生成大规模地形空间数据(multi GB),使  用 OpenSceneGraph 的自带数据分页调度支持来查看这些数据。 

     

    节点工具箱 

    这个场景图同样有一套节点工具集,它们是可以在你的应用程序中编译或者在运行时装载的独立库: 

         osgParticle——粒子系统 

         osgText——高质量抗锯齿文本 

         osgFX——特效框架结构 

         osgShadow——阴影框架结构 

         osgManipulator——交互控制 

         osgSim——虚拟仿真相关的效果 

         osgTerrain——地形绘制 

         osgAnimation——动画 

         osgVolume——体绘制(通过 Dicom 插件支持医学数据) 

     

    可移植性 

    场景图的内核已经被设计成尽量少的依赖具体的平台,很少的部分 超出了标准 C++程序和 OpenGL。这就使得这个场景图可以快速移植到大部分系统中——最开始在 IRIX 开发,然后移植到 Linux,接着 到 Windows,再后来就是 FreeBSD,  Mac OSX,Solaris,HP-UX,  AIX  甚至是 PlayStation2! 

    完全独立与窗口操作系统的场景图内核库使得用户在它上面可以增 加他们自己的指定窗口库和应用程序,在发布版本中 osgViewer 库提供自带窗口支持,可支持 Windows (Win32),Unix  (X11)  和  OSX  (Carbon)。osgViewer 库也可以轻松的和你的窗口开发包集成起来,作为OpenSceneGraph-2.0 发布版本的一部分,有例子演示了如何在 Qt, GLUT, FLTK, SDL, WxWidget, Cocoa and MFC 中的使用。 

     

    可伸缩性 

    场景图内核的可扩展性使得它不仅仅可运行在便携式设备,甚至高 端的多核、多  GPU的系统和集群上。这可能是因为场景图内核为 OpenGL  的显示列表和纹理对象支持多重图形渲染环境(multiple  graphics  contexts),剔除和绘制的遍历过程被设计成隐藏渲染数据为局部变量,这样可以以几乎只读的方式使用场景图内核。这样就允许多对剔除—绘制过程运 行在多个 CPU 上,CPU 则是绑定在多个图形子系统之上。对多图形设备渲染环境和多线程的支持可以在 osgViewer 中方便使用,发布版本中所有的例子都可以以多线程和多 GPU 的方式运行。 

     

    多语言支持 

    OpenSceneGraph 以社区项目的形式支持多种语言,比如 Java,Lua 和 Python。 

    3   OGRE 与 OSG 的异同 

    通过上一节的简介可以大致了解到这两大 3D 绘制引擎的功能特性,同时也容易察觉到两者的异同。下面就两者的具体说明: 

    设计和体系 

    如果你曾经使用传统而基本的方法进行过  3D  应用程序开发(换句话说,就是有使用OpenGL 或者 Direct3D 这种底层 API 的经验),你会了解到它们有一些相似而且繁琐的过程:

    通过调用 API 设置渲染状态;通过调用 API 传送几何体信息;通过调用 API 通知 GPU 渲染;清理;返回到第一步,直到渲染完一帧进入下一帧。这个过程会让你陷入纷杂的 API 操作之中,相对于真正的应用,可能你会被浪费在基本的几何体操作中去。如果使用面向对象的方法来渲染几何体,就可以从几何体级别的处理工作中抽离出来,转 而处理具体的场景和在场景中的物体。其中的物体包括:可活动的物体、静态物体组成的场景本身、灯光、摄像机以及其他。你只需简单的把物体放到场景之 中,OGRE 或 OSG 绘制引擎可以帮助你完成杂乱的几何渲染处理。也是为什么我们在开发 3D 应用程序时不直接使用 OpenGL 或 D3D 的原因。 

    OGRE 和 OSG 在架构设计上存在着许多共同之处,都是为了兼顾系统的高效性、可移植性和可扩展性,采用了以下设计理念和工具进行系统的设计和构建: 

         ANSI 标准 C++ 

         C++标准模板库(STL) 

         设计模式(Design patterns,  Gamma95) 

    通过设计模式的一些模式如 Abstract  Factory、Listener、Adopter、Singleton 等,提高程序库的扩展性并易于与其它库协同工作。如 OSG 和 OGRE 库都有大量的功能强大插件支持,并可以同第三方界面库(如 Qt、MFC、WxWidget 等)分工合作。 

    但两者也存在着一些明显的不同之处。OGRE 从它的命名上可以直接看出,它是一个面向对象的三维绘制引擎。相比 OpenGL 和 D3D 的显明带有面向过程特征的 API,经过抽象的面向对象 API 更简明,使用更方便。而 OSG 是在 OpenGL 基础上提供了很多使用方便的功能包,并没有对底层图形接口(OpenGL)进行抽象。下面《Pro  OGRE 3D  Programming》中关于面向对象的优势所在的论述: 

     

    嗯,现在的图形引擎就像任何庞大的软件系统。在一开始很苗条, 但很快变成惊人复杂的怪兽,让人难以理解它。这样大的系统难于管理,任何对系统的修改都可能影响其可靠性。而在这样一个不断出现新技术和手段的领域,修改 又是必不可少。大量的使用 c 函数调用也无法对这一情况有任何改善  ——  即使所有的函数都是同一个人写的。通常会发现,几个月以后,一小段代码也会变得复杂难懂;该如何组织这些函数也会变成一个难题。 

    面对对象是解决复杂性问题的一个常用手段。它逐步的把代码分解 到函数中,把函数和表示状态的数据用类组织起来,以表示现实中的各种概念。它能让你把复杂性隐藏在容易确定的代码包当中,只暴露出简单易用的接口。这样你 就有了可以搭建在一起的“建筑材料”。你也可以通过组织这些材料使它们有一致的外部接口,而在内部,实现这些接口的方法却各不相同。这同样减少了复杂性, 因为开发者只需要学习一种接口。 

     

    同时,OGRE 只专注于绘制,不负责其它模块,如用户界面、声音、网络、碰撞检测等,其它模块都是以插件的形式存在。而 OSG 提供了更多的功能,如前者所没有的功能,如虚拟仿真、体绘制、分页地形加载(最新 OGRE1.7  也引入了部分相关功能)等。所以如果是要利用现有成熟模块的项目可以使用  OSG,而需要开发更成熟更商业化的产品可以使用OGRE。 

     

    平台支持 

    从前面的特性分析可以看出,OGRE 与 OSG 对平台的支持的侧重点有所不同,如 OGRE侧重于成熟的商业化的平台,如 D3D 及主流图形操作系统,从而可以。而 OSG 强调支持多个操作系统,如 FreeBSD、Solaris、HP-UX、AIX 等,只要是支持 OpenGL 的平台,OSG 就有可能支持。由于大部分游戏及商业软件是基于 D3D 的,而 OGRE 对 D3D 提供了很好的支持,所以如果是开始游戏,OGRE 是一个很好的选择。 

     

    资源管理 

    不管地形、纹理还是字体等一切对象,绘制它们都需要不同的资 源。如何加载、重用、卸载这些资源是非常重要的,因此,有专门的一批类来完成这些事情。OGRE 提供了一个功能完美的资源管理系统,包括对材质、Shader、粒子系统等一系列资源的分离于代码外的管理。OGRE 定义了功能强大的材质声明文件,可以在文件中直接定义纹理、绘制状态、Shader等信息,从 OGRE1.6  起还支持简单的变量和声明继承等,极大的方便了资源管理工作,更代码思路更清晰。 

    在图形引擎中,有大量的状态管理和上下文相关操作的代码。封装 能把这些代码放在独立的资源声明文件中,这样以来代码就更容易理解。而且由于封装避免了复制代码方式的重用,也使得程序变得更可靠。且这些资源声明文件也 是独立于平台的,这是 OGRE 作为一个成熟的 3D 绘制引擎的一个重大特性。 

     

    场景树管理 

    OGRE 与 OSG 都有一个场景树在管理整个场景的相关信息,通过场景树可以方便的管理场景物体,并且在向底层接口提交绘制操作前进行一些软裁剪和绘制顺序调整工作。同时OGRE 与 OSG 的场景树上每个节点所代表的内容是不同的。 

    首先,Ogre 对场景图的操作维持在接口级别;它并不关心去操作图形的具体算法实现。换言之,Ogre 只是通过 API 来操作场景图,进而忽略了具体的算法实现。其次,Ogre 的场景图接口只负责维护场景结构。节点中没有包含任何固有的内容和管理方法。具体的内容被

    放置到一种可渲染(Renderable)对象之中,它提供了场景中全部几何图形(包括活动的的或者其他所有的)。它们的渲染的属性(也可以说是材 质)被包含在实体(Entity)对象中,在实体对象里面同样包含着一个或多个子实体(SubEntity)对象,这些子实体才是是真正可

    以被渲染对象。 

    场景图形树结构的顶部是一个根节点。从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息。 

    ORGE《Pro OGRE 3D Programming》中提到: 

      虽然没有得到权威的论证,但我还是坚信场景图和场景内容的分离的设计一定是整个Ogre 项目中最亮眼的地方。虽然看起来它是一个如此的简单易懂,不过对于那些仍然坚守“传统的设计方法”来完成场景图设计的人仍然会难以理解。  

    在传统设计中(就是很多商业和开源 3D 引擎所采用的)将场景内容和场景结构放到一个继承体系中,并将场景内容生硬的作为场景节点的子类。我断言这是一个极其失败的设计方案。如果不修改所有的子 类,基本上是没有办法更改或者扩充图形算法的,因此让修改基类的接口非常困难,进而导致以后的维护工作变得举步维艰。此外这种“所有节点源自同一节点类 型”的设计思想会让整个程序变得凝固且难以复用(至少从维护的观点看):

    当增加新的基类功能方法或者属性的时候,不管是否真的需要,这些都强迫的塞入所有子类。最后导致哪怕是对基本功能做很小的修改,都会牵一发会动全身,  导致开发维护最终变得难与控制。这种糟糕的设计理念让陷入的人们痛苦不堪,从而希望摆脱这种逻辑采用全

    新的设计方法。 

     

    可以看出 OGRE 是出于可维护性和可扩展性才选择这种场景树管理方式的。配合 OGRE强大的代码资源分离功能,及可扩展的多场景管理器支持能力,这种简明的场景树管理设计取得了重大成功。 

     

    易用性 

    为了使代码可以支持 D3D 和 OpenGL 引擎,OGRE 编程中不推荐直接使用 D3D 或 OpenGL的 API,且绘制流水线与底层的 API 有一定区别,这就提高了入门难度,加大了学习曲线的陡峭程度。而OSG 只是基于OpenGL 单个底层API 的,所以可以直接在OSG 工程中加入 OpenGL的 API 调用,且一般情况下只也是唯一方案,如要使用 OSG 所没包括的新的 OpenGL 扩展。

    从这点来看 OSG 比较适合要用到新的显卡技术的项目,而 OGRE 比较适合技术通用、成熟且要求使用更适合游戏的 D3D 引擎的项目。如前面提到的 OGRE 有一个强大的、功能齐全的资源管理器,可以大大减轻资源管理复杂度,提高资源加载、分配和利用效率。这有助于把美工、效果与代码分离,使编程时逻辑更清 晰。这是程序设计的一个主流方向,如 Nokia的 Qt 用户界面库就是一直朝这个方向发展的。 

     

    相关支持 

    OGRE 与 OSG 在对一些资源和功能的支持上也存在这差异,如 OGRE 没有提供像 OSG 那样广泛的 Mesh 文件格式支持。其实 OGRE 只支持自身特有的.mesh 文件支持,而其它模型只能通过转换到这种格式才可以载入。同时 OGRE 也没有提供输入输出相关支持,需要通过独立模块 OIS(Object  Oriented  Input  System)来支持输入输出操作。总的来说,OGRE 专注于 3D 绘制,而 3D 应用程序所需要的其它功能可以由插件或其它库完成。相对而言,OSG提供的支持会多些,如体绘制(osgVolume)、仿真模拟(osgSim)、声音 支持(osgAL)等模块。 

    4   小结 

    本文简单介绍了一些 OGRE 与 OSG 的一些特性及之间的功能对比,在简化 3D 图形编程在设计理念下,两者又保持着自己独特的设计路线。OGRE 的特色在于成熟的设计模式、出色的资源管理方式和良多的跨平台性(特别是支持 D3D);OSG 的特色在于丰富的相关开源项目和文档、很多现成的功能模块。 

    同是开源项目,OSG 由一个超过 200 人的大规模开发队伍,而 OGRE 却拥有一个精小强悍的开发团队(现在共 7  人)。OGRE  相对而言比较活跃,功能更新频繁,这对于技术变化快速的图形绘制领域是重要的。至今,已有多款商业游戏使用了 OGRE 图形绘制引擎,如国内的网络游戏“天龙八部”、近期流行游戏“火炬之光”(Torchlight 2009.10)、网游“Zero Gear”等。OSG 偏向于虚拟仿真领域,强调库的功能胜于程序设计理论。两者都拥有着强大的开源社区,并是开源项目,随时可以方便的查看源代码,这对于开发应用程序是很有帮 助的。 

     

    展开全文
  • 我看未来游戏(图形引擎的几大特性

    千次阅读 热门讨论 2011-03-04 12:39:00
    一直从事渲染引擎的开发,也经常会去关注其他游戏引擎的发展。其实开发做了很久,才会发现有一些问题需要去考虑:怎样才能算作引擎、怎样才算是优秀的引擎?我想引擎应该不只是能做出一款商业游戏就能算作称职的。再...

     

    一直从事渲染引擎的开发,也经常会去关注其他游戏引擎的发展。其实开发做了很久,才会发现有一些问题需要去考虑:怎样才能算作引擎、怎样才算是优秀的引擎?我想引擎应该不只是能做出一款商业游戏就能算作称职的。再看看现在著名的几款商业引擎都有各自的特色,不妨设想一下未来的游戏引擎都会有哪些特性:

    1. Multi-Threading

    记得大概还在一两年前的时候,很多人还在感慨多线程对游戏没有多大的加速效果。但是转眼间,我们已经进入了四核甚至八核流行的年代,我想众核离我们也未必远矣。最初游戏中对多线程的使用还仅限于将渲染线程独立到一个单独的线程中执行,来达到CPU和GPU运算的同步执行,但是进入了多核年代这肯定已经不能发挥出CPU的全部实力。随便设想一下其他可能并行加速的运算:骨骼动画、粒子系统、AI、甚至Scene Graph的遍历,想象的空间还很大呢。

    2. GPU通用计算(Cuda、Direct Compute、 OpenCL)

    同上类似,骨骼动画、粒子系统都可采用GPU通用计算进行加速,DX11通过Direct Compute提供了更好的OIT等效果, 相信其他的应用也不难挖掘。

    3. 更全面的支持各种渲染API(DX9,DX10,DX11,OpenGL,OpenGL ES!)

    能全面支持DX9, DX10,DX11,OpenGL图形API,并且用统一的接口提供所有API提供的特性,恐怕没几个引擎能做到。在这里我想强调的是OpenGL ES, 现在移动设备大有取代PC的趋势,支持OpenGL ES可能是未来引擎不可或缺的功能。不过考虑到某些平台对开发环境有特别的要求,比如WM7只支持.Net开发,这对我们开发通用的跨平台引擎带来了更大的难度。

    4. 更好的场景管理加速

    目前看来k-d tree是一种较优的Scene Graph。 为了达到更好的加速效果,往往要结合其他加速方式:统一的LOD机制(Geometry LOD、Shader LOD、Texture LOD); 遮挡剔除算法;渲染状态的管理,减少状态的切换;场景零碎物体的合并(Geometry combine),减少draw call;Instancing, 同样减少draw call;甚至把零碎的小图合并到一张大的Texture atlas里面,等等。。。

    5. 更好的材质、光照

    目前统一的Blinn-Phong光照早晚有被替代的一天,Ward可能是下一个常见的光照模型。再加上不同的材质,石头、陶瓷、玻璃、布料等等,都会有不同的运算,这里改进的空间还有很大。

    6. 更好的Shader系统

    传统上有很成熟的shader tree/shader graph系统,现在Dx11带来了Dynamic Shader Linkage特性,期待在这一方面会有所突破。

    7. 更拟真的动画系统

    Animation可能是最被国内开发团队所忽视的一个领域,这里并不是说我们没有投入足够的美术资源去完成动画,而是在前沿的动画技术上落后了很多。现在Kinect都来了,motion capture还会远么。想做到人物动作的拟真,不只是要有真实的动作数据,更重要的是人物动作和周围环境的交互,不管是跨越障碍还是飞檐走壁都离不了和环境的交互。如果只是简单的播放动画,只能给人木偶一样的感觉。

    8. 更广泛的使用脚本语言,带来更多的动态特性

    脚本绝不是只能用在UI系统内部,AI甚至对渲染管线的控制都可以让脚本语言接管,LUA应该是最佳候选。有人可能会说用脚本语言控制渲染管线效率太低了,不可否认这个缺点,但是它也带来很多好处,实时编辑运行甚至在Editor中使用图形化的手段进行控制都可以带来更大的易用性。我大胆的提出一个设想,可以实现一个系统在游戏发布之前将LUA脚本语言编译成C++代码,再使用其他C++的编译器(比如ICC、GCC)将C++代码生成为目标的DLL库。这看似让我们走了一个圈回到了原地,但是中间环节仍然带来了很多的收益。

    9. 更智能的AI

    不用多说了。

    更具体的Feature

    1. Mega Texture(SVT)

    对无限大贴图的支持会带来什么,看看ID Tech5就知道了,它的重要性不言自明,另可参考Sparse Virtual Texture。

    2. Real-Time GI(Cascaded Light Propagation Volumes、SSGI、...)

     

    其他具体的地形、shadow、tessellation等等细节的技术就不赘述了。

    暂时先想到这些,随时可能再增减。但是不是做到这些就足够了呢?

    这个。。会不会有一天rasterization被real-time ray tracing所取代了?这。。。。

     

    展开全文
  • 学习shader之前必须知道的事情,shader(着色语言)...对开发人员来说很重要,也许你刚刚接触,或者你在使用已有的产品,很优秀的游戏引擎,或者渲染引擎,你 觉得知道这个没有太大意义,但知道了这些,总归对你没有坏

    此文章来自于:http://www.cnblogs.com/zhanglitong/p/3238989.html

    学习shader之前必须知道的事情,shader(着色语言)到底发生在那个阶段, OpenGL的渲染管线有哪些阶段

    对开发人员来说很重要,也许你刚刚接触,或者你在使用已有的产品,很优秀的游戏引擎,或者渲染引擎,你

    觉得知道这个没有太大意义,但知道了这些,总归对你没有坏处。

     

    下图是一个非常简化框图流水线的各个阶段,并在他们之间传播的数据。虽然极其简单,它是足够的着色器编程,

    提出了一些重要的概念。固定管线中存在很多阶段,并存在很多细节,这里只是粗略的介绍。

    (1)顶点变换:

    在这里,一个顶点的属性,如在空间的位置,以及它的颜色,法线,纹理坐标,其中包括一组。这个阶段的输入

    的各个顶点的属性。由固定的功能所执行的操作,主要完成一下工作:

      1.  顶点位置变换
      2.  计算顶点观照
      3.  纹理坐标变换

    (2)图元装配:

        这个阶段的输入的变换后的顶点,以及连通性信息。这后者的一块数据告诉顶点如何连接,以形成一种原始的

    绘制数据,这个阶段还负责对视锥裁剪操作,背面剔除。光栅扫描确定的片段,和原始的像素位置。

    在此上下文中的片段是一块的数据,将用于更新的像素在帧缓冲区中,在特定的位置。片段包含不仅是颜色,

    也法线和纹理坐标,其中包括可能的属性,被用来计算新像素的颜色。上面的顶点变换阶段,计算出的值与顶点连接信息相结合,

    允许当前阶段来计算相应的属性的片段。比如,每个顶点的变换位置。当考虑到顶点,使一个原语,

    是可以计算的原始片段的位置。另一个例子是,使用的颜色。如果一个三角形,然后用不同的颜色有其顶点的颜

    色的三角形内的片段片段的相对的顶点的距离加权的三角形的顶点的颜色插值的方式获得。

    (3)纹理映射,着色:

      插值片段信息是这一阶段的输入。彩色已经在前一阶段的计算是通过内插法,在这里,它可以结合例如一个纹理像素(纹理元素)。

    纹理坐标也已经在前一阶段内插。雾也适用于在这个阶段。每个片段的本阶段的共同的最终结果是一个颜色值和深度的片段。

    (4)最后阶段的管道上的片段,进行了一系列的测试:

      1. 裁减测试
          2.Alpha(透明度)测试
          3.模板测试
          4.深度测试

    通过测试的片段信息,然后用于更新的像素的值,根据当前的混合模式。请注意,混合只发生在这个阶段,因为片段纹理和着色阶段,

    有没有访问帧缓冲区。帧缓冲区是唯一能够在这个阶段。

    下图很明了的说明了各个阶段的任务:

    最后这个图画 的比较丑,大家见谅(ps 基本属于文盲),鉴于本人能力有限,对各个阶段的理解如有不错误

    还请指教。

       最后,到shader上场了,shader具体在那个阶段呢(现在的shader已经出到第四版本了,增加了很多新功能)

    vertex shader(顶点shader)发生在顶点变换阶段,通过顶点shader可以修改一些基本的图元属性,颜色,光照,发现等

    fragment shader(片段shader)主要发生在 纹理着色阶段,主要是对上一阶段输出的数据,进行再次加工。

    展开全文
  • C++、计算机图形学、游戏开发 等 7 个话题的优秀回答者书籍:多数书籍比较系统地介绍一些课题,由浅入深(gems 类例外,可当作业界 journel)。如果初接触一些新技术,尽量找相关专著。我把一些书分类在 計算機圖形:...
  • 目前市面上有好几款常用的图形库,在这些图形库的底层都有渲染引擎在支撑。 ZRender 是其中一款非常优秀的 Canvas 动画引擎,它也是 ECharts 图表库底层的渲染引擎。 本次腾讯云大学大咖分享课程邀请 腾讯云最具价值...
  • GPU 是并行编程模型,和CPU的串行编程模型完全不同,导致很多CPU 上优秀的算法都无法直接映射到GPU 上,并且GPU的结构相当于共享存储式多处理结构,因此在GPU上设计的并行程序与CPU 上的串行程序具有很大的差异。...
  • OGRE: Ogre1.8.1VS2010环境配置

    千次阅读 2014-02-27 14:30:30
    "伟大航路,我把世界上的一切都放在了那里,有种的话就去领取吧"这是OGRE中文网的...Ogre(Object-oriented Graphics Rendering Engine)是一款优秀的C++开源图形渲染引擎。OGRE主要提供渲染引擎,但是在系统API,文件管
  • VS2008编译NxOgre全攻略

    千次阅读 2015-04-02 18:34:48
    Ogre是一款开源的图形渲染引擎,可惜仅仅是渲染引擎,因此就得需要其他的物理引擎来实现。不知什么原因,NxOgre的官网已经挂掉。因此,也只能通过github的教程来一窥。官网教程地址:...
  • vs2008编译nxogre全攻略

    2015-02-20 19:21:30
    Ogre是一款开源的图形渲染引擎,可惜仅仅是渲染引擎,因此就得需要其他的物理引擎来实现。不知什么原因,NxOgre的官网已经挂掉。因此,也只能通过github的教程来一窥。官网教程地址:...
  • Ogre学习教程:Ogre1.8.1+VS2010环境配置

    万次阅读 多人点赞 2013-03-27 00:01:54
    “伟大航路,我把世界上的一切都放在了那里,有种的话就去领取吧” 这是OGRE中文网的一则广告,我想,...Ogre(Object-oriented Graphics Rendering Engine)是一款优秀的C++开源图形渲染引擎。OGRE主要提供渲染引擎,
  • Ogre1.8.1+VS2010环境配置(适用于Ogre1.9)

    千次阅读 2013-09-21 16:16:40
    伟大航路,我把世界上的一切都放在了那里,有种的话就去领取吧” 这是OGRE中文网的一则广告,我想,...Ogre(Object-oriented Graphics Rendering Engine)是一款优秀的C++开源图形渲染引擎。OGRE主要提供渲染引擎,但
  • 简介 Ogre(Object-oriented Graphics Rendering Engine)是一款优秀的C++开源图形渲染引擎。OGRE主要提供渲染引擎,但是在系统API,文件管理以及范例中都提供的非常丰富的接
  • OGRE: Ogre SampleBrowers框架解析

    千次阅读 2014-02-27 14:35:31
    简介 Ogre(Object-oriented Graphics Rendering Engine)是一款优秀的C++开源图形渲染引擎。OGRE主要提供渲染引擎,但是在系统API,文件管理以及范例中都提供的非常丰富的接口和范例,在
  • Ogre是一款优秀的3D图形渲染引擎,在国内,很多前辈从04年甚至更早就对它有了深入的了解,并留了许多译文和心得,极大的便利了我的学习。虽然我起步比较晚,但仍希望自己学习间的这些记录和翻译能够帮助到他人,如您...
  • l 前言 Ogre是一款优秀的3D图形渲染引擎,在国内,很多前辈从04年甚至更早就对它有了深入的了解,并留了许多译文和心得,极大的便利了我的学习。虽然我起步比较晚,但仍希望自己学习间的这些记录和翻译能够帮助到...
  • 即使经验丰富的游戏开发人员,有时也难以将自己的设想转变成一个优秀的游戏。可用的编程语言、库和生产方法如此之多,使得开发过程变得令人生畏,得到的游戏代码也很容易复杂而不可靠。 精通C#游戏编程 目录 第Ⅰ...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    JGraphEd 是一个 Java 的图形编辑应用和绘图框架。 Java 穿越NAT方案 JSTUN.tar JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

优秀的图形渲染引擎