三维渲染引擎设计与实践(一)

一、初始osg

三维渲染引擎:为了实现三维场景图形的结构管理和绘制而提供的一系列API的集合。包括构建层和交互层。

Crystal Space、Java3D、Unreal……

osg库:构件场景图形的场景图形节点类、用作向量和矩阵运算的类;可绘制体和几何体类;用于描述和管理渲染状态的类;以及图形程序所需的典型功能类。

osgDB库:用于2D和3D文件读写的插件类注册器,以及用于访问和读写这些插件的特定功能类;数据的动态分页调度机制

osgUtil库:实用工具库。包括场景图形数据统计和优化工具、渲染后台工具、场景剪裁工具;以及大量几何操作相关的类

osgGA库:提供各种视景窗口交互事件的管理工具,用于构建一个与平台无关的人机设备抽象层

osgView库:视景器工具库

osgAnimation:场景动画处理库

osgFX:场景特效库

osgManipulator:场景对象操控库

osgParticle:粒子特效库

osgShadow:阴影特效库

osgSim:仿真工具库

osgTerrain:地形处理库

osgText:文字处理库

osgVolume:体渲染实现库

osgWidget:三维控件库

 

三、开发预备知识

3.1 向量

向量的点积(数量积、内积),也就是两个向量各分向量乘积之和,结果为一个标量

AB = |A||B|cos<A,B>=x1*x2 + y1*y2 + z1*z2 

向量的叉积(向量积),结果为一个垂直于原向量的新向量。

 |A×B| = |A||B|sin<A,B>                                A×B=( y1z2 - y2z1 , x1z2 - x2z1 , x1y2 - x2y1)

四元数  一种由三个复数和一个实数组成的复杂数字系统xyzw。可以表达物体绕任意向量轴的旋转。http://blog.csdn.net/chenlanjie842179335/article/details/8039031

转置  加减  点积(两个四元数各分量乘积之和)  共轭   Quat表达

矩阵  加减 数乘 转置 逆   osgMatrixd

包围体  包围球和轴对称包围盒 osgBoundingBoxImpl

3.2数组对象

OSG的数组用途:1.表达单精度或双精度的浮点数据,包括数值、多维向量等,以便用于OpenGL顶点坐标(vec3)、颜色(vec4)、纹理坐标(vec2)等属性数组的设置;2、表达顶点数据的索引,此时数组的元素一般是整数类型,索引数组在绘制OpenGL几何图元时尤为常见。

osg::Array    osg::IndexArray

3.3 内存管理机制

OSG中新建的场景对象建议使用ref_ptr进行内存的分配和管理。

新建对象作为函数结果返回时,建议使用release()传递,并尽快引入到别的场景对象中。

参照对象  是引用计数和对象自动卸载的实际执行者 osg::Referenced。主要的派生类为osg::Object

 

四、场景的组织结构

4.1节点的定义与种类

osg采用包围体层次(Bounding Volume Hierarchy,BVH)来实现场景图形的管理。包围球、包围盒。采用树状结构来保存信息。一颗场景数:一个根节点,多级内部的枝节节点,以及多个末端的叶子节点。根节点和枝节节点负责构件树的层次,以及完成某种特定的功能;而叶子节点则保存某一个或多个可绘制对象的信息。所有节点都维护一个自身的包围体。

osg::Node表达一个基本节点,基类。需要一个BoundingSphere表达自己的包围球形体。

叶节点osg::Geode几何节点,保存和管理一个或多个可绘制物体的信息,这些可绘制形体的容纳者为Drawable类,包括几何模型、图像、文字。

组节点Group osg::Group,作为场景树结构的枝节存在,将子节点成组进行管理和调度。

(1)空间变换节点,  它可以改变自身在三维空间中的位置和姿态,进而影响子节点的控件位置变化。使用Transform类表达  

(2)开关节点, 分别使用SwitchMultiSwitch类来表达开关节点和可细分的多重开关节点

(3)细节层次节点(Level of Detail,LOD)。在不影响渲染外观的前提下,根据实际情况选择一种更为简单的方式来表达要渲染的物体,减轻系统绘制场景的负担。静态离散LOG(预置有限数目个细节层次方案)、连续LOD(Continuous LOD,实时计算和改变对象的表达方案)、混合LOD(对两个表达方案进行线型混合)

(4)相机节点  Carmera

(5)投影节点 Projection

(6)渲染属性节点    光照、雾效果、透明效果、纹理贴图等  StateSet

(7)覆盖节点 OverlayNode

(8)遮挡裁减节点OccluderNode类

(9)动态调度节点 PagedLOD

(10)关节节点osgAnimation库的Bone类和Skeleton类(某个完整形体骨骼结构的根节点)

(11)代理节点  作为另外一种尚未加载的节点的代理者  ProxyNode节点

4.2节点的访问     http://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html

访问器(Visitor,访问者)是一种经典的对象行为模式。  osg::NodeVisitor类

1.节点接受一个访问器,用户执行某个节点的accept()函数,将一个具体的访问器对象传递给节点

2.节点反过来执行访问器的apply()函数,并将自身传入访问器。

void Node::accept(NodeVistor& nv)

{  nv.apply(*this) ;   }

3.在具体访问器对象中重写的apply()函数中,执行节点的具体访问操作。

深度优先遍历 P79 自定义访问器

osg的节点主要使用回调(CallBack)来完成用户临时定义的、需要每帧执行的工作。

回调是一种用户编写的功能模块,可以作为一个参数传递给其他功能模块,从而实现对某些底层系统事件的响应和处理。c++使用函数指针,.net托管。

osg节点回调包括更新回调(Update Callback)和人机交互事件回调(Event Callback)。回调类基类osg::NodeCallback  P82

http://blog.csdn.net/u011310341/article/details/51209581                  人机交互时间回调和时间的区别

 4.3重要节点的功能实现 P84

 

转载于:https://www.cnblogs.com/hanmolabi/p/7197721.html

第1章 初识openscenegraph(osg). 1 1.1 场景图形初步 2 1.1.1 场景图形的概念 2 1.1.2 具体实现:三维渲染引擎 2 1.1.3 主流渲染引擎介绍 3 1.2 openscenegraph概述 4 1.2.1 诞生与发展 4 1.2.2 优势与不足 5 1.3 openscenegraph的组成结构 6 1.3.1 核心结构 6 1.3.2 资源获取 8 1.3.3 中文社区 8 第2章 osg的安装与调试 9 2.1 快速安装和使用 10 2.1.1 下载预编译包 10 2.1.2 设置环境变量 11 2.1.3 建立工程环境 13 2.1.4 范例:第一个程序 15 2.2 从源代码进行编译 16 2.2.1 osg源代码的获取与更新 16 .2.2.2 编译环境生成工具cmake 19 2.2.3 基本编译选项 22 2.2.4 高级编译选项 25 2.3 调试输入与输出 28 2.3.1 命令行输入 28 2.3.2 调试输出 29 第3章 开发预备知识 31 3.1 基本数学组件 32 3.1.1 二维与多维向量 32 3.1.2 四元数 35 3.1.3 矩阵 37 3.1.4 包围体 41 3.2 数组对象 44 3.2.1 数据数组 44 3.2.2 数据索引数组 46 3.3 内存管理机制 47 3.3.1 智能指针 48 3.3.2 参照对象 51 3.3.3 范例:智能指针的使用 52 第4章 场景的组织结构 55 4.1 节点的定义与种类 56 4.1.1 场景图形bvh树 56 4.1.2 节点的父子关系 58 4.1.3 叶节点与组节点 59 4.1.4 节点的功能与分类 62 4.2 节点的访问 65 4.2.1 访问器机制 65 4.2.2 节点的遍历函数 67 4.2.3 范例:节点属性访问器 68 4.2.4 节点的更新与事件回调 70 4.2.5 范例:使用回调实现旋转动画 71 4.3 重要节点的功能实现 74 4.3.1 空间变换节点 74 4.3.2 范例:使用空间变换节点 79 4.3.3 开关节点 81 4.3.4 范例:使用开关节点 82 4.3.5 细节层次节点(lod) 83 4.3.6 范例:使用lod节点 85 4.3.7 范例:节点代理 86 第5章 绘制几何对象与文字 89 5.1 几何元素的储存 90 5.1.1 顶点属性 90 5.1.2 顶点数组、显示列表和vbo 91 5.1.3 构建几何体对象 94 5.1.4 范例:简易房屋 100 5.2 几何元素的绘制与访问 103 5.2.1 几何体的绘制实现函数 103 5.2.2 数据的更新显示 108 5.2.3 几何体的更新回调 109 5.2.4 范例:跃动的线 110 5.2.5 信息获取和统计 112 5.2.6 范例:使用仿函数遍历几何体 113 5.3 位图的显示 116 5.3.1 图像与图像的绘制 116 5.3.2 范例:在场景中绘制位图 119 5.4 文字的显示 120 5.4.1 文字的绘制方法 120 5.4.2 文字的绘制实现函数 123 5.4.3 字符编码格式 124 5.4.4 范例:一首古诗 127 第6章 设置纹理和渲染属性 131 6.1 渲染属性与模式 132 6.1.1 opengl中的渲染状态设置 132 6.1.2 节点的渲染状态集合 132 6.1.3 渲染属性概览 135 6.2 纹理与纹理属性 139 6.2.1 纹理的实现方法 139 6.2.2 纹理的分类 143 6.2.3 范例:场景中的纹理设置 146 6.2.4 范例:纹理的明细层次(mipmap) 149 6.3 属性的实现与访问 152 6.3.1 将属性应用到场景 152 6.3.2 渲染状态集回调 153 6.3.3 范例:雾参数的实时更新 153 6.4 osg与opengl着色语言 155 6.4.1 opengl着色语言 155 6.4.2 着色器属性 159 6.4.3 一致变量回调 162 6.4.4 范例:在场景中使用glsl着色语言 162 第7章 观察我们的世界 167 7.1 场景的观察与变换 168 7.1.1 opengl中的变换 168 7.1.2 相机节点 171 7.1.3 范例:鸟瞰图相机 174 7.2 图形设备接口 176 7.2.1 图形设备与相机 176 7.2.2 窗口与像素缓存(pixel buffer) 179 7.2.3 渲染到纹理(render to texture) 181 7.2.4 范例:将场景渲染到纹理 183 7.3 视景器 186 7.3.1 视景器的主要工作 186 7.3.2 单视景器与多视景器 188 7.3.3 范例:投影墙显示 191 7.3.4 范例:多视景器系统 192 7.3.5 视景器辅助部件 194 第8章 人机交互与图形用户接口 197 8.1 获取鼠标和键盘消息 198 8.1.1 事件适配器 198 8.1.2 动作适配器 202 8.1.3 事件队列与处理器 203 8.1.4 范例:处理键盘事件.. 205 8.2 三维人机交互工具 207 8.2.1 漫游器 207 8.2.2 拖曳器 210 8.2.3 范例:场景拖曳器的实现 214 8.3 二维图形用户接口 217 8.3.1 窗口设备 217 8.3.2 windows下窗口设备的实现 219 8.3.3 范例:使用windows api构建渲染窗口 221 第9章 场景中的动画效果 225 9.1 场景动画基本组件 226 9.1.1 关键帧 226 9.1.2 采样与插值 228 9.1.3 动画频道 231 9.1.4 动画更新回调 236 9.1.5 范例:关键帧路径动画 239 9.2 刚体动画 242 9.2.1 简单路径动画 242 9.2.2 范例:使用路径动画回调 244 9.2.3 动画的多频道融合 245 9.2.4 范例:基本动画管理器 246 9.3 角色与变形动画 249 9.3.1 骨骼动画 249 9.3.2 范例:骨骼运动 252 9.3.3 变形体 255 9.3.4 范例:对折硬纸 257 9.4 渲染状态与纹理动画 259 9.4.1 渐进动画(ease motion) 259 9.4.2 范例:物体的淡入淡出 262 9.4.3 纹理动画 264 9.4.4 范例:纹理动画效果 266 第10章 文件的读写机制 269 10.1 数据文件支持机制 270 10.1.1 文件格式概述 270 10.1.2 osg支持的文件格式 272 10.1.3 基本文件读写接口 277 10.2 文件读写插件 279 10.2.1 插件的编写和注册 279 10.2.2 插件的职责链机制 283 10.2.3 文件读写回调 285 10.3 插件设计方法 287 10.3.1 范例:简单插件设计 287 10.3.2 范例:文件读取进度 290 10.4 osg(即.osg)格式及其扩展 292 10.4.1 封装器 292 10.4.2 场景扩展库插件 295 第11章 场景的动态更新与裁减 297 11.1 场景的更新流程 298 11.1.1 人机交互事件的更新 298 11.1.2 用户请求与系统调度的更新 299 11.2 场景的裁减流程 300 11.2.1 裁减的意义与常用技术 300 11.2.2 裁减访问器 303 11.2.3 状态树与状态节点 305 11.2.4 状态树的构建 309 11.2.5 裁减回调 312 11.3 数据的动态调度 313 11.3.1 动态调度技术概述 313 11.3.2 分页数据库 314 11.3.3 范例:分页lod节点 316 11.3.4 分页图像库 318 第12章 场景的多线程渲染 319 12.1 多线程开发技术概述 320 12.1.1 多线程开发的常用概念 320 12.1.2 openthreads库简介 321 12.1.3 范例:线程的创建与控制 324 12.1.4 osg操作线程 325 12.2 基本场景渲染流程 327 12.2.1 osg状态机 327 12.2.2 构建场景渲染树 333 12.2.3 渲染树的优化排序 338 12.2.4 范例:广告牌森林 339 12.3 多种线程模型的讨论与实现 341 12.3.1 渲染器与场景视图 341 12.3.2 单线程模型 347 12.3.3 多设备裁减/绘制模型 348 12.3.4 多设备绘制模型 349 12.3.5 多相机绘制模型 350 12.3.6 数据变度 351 第13章 开源社区与未来 353 13.1 基于osg的开源工程 354 13.1.1 地形与地理信息 354 13.1.2 特效实现 356 13.1.3 扩展节点组件 358 13.1.4 数据和场景管理 358 13.1.5 其他语言封装 360 13.2 开发者资源 360 13.2.1 实用网址 360 13.2.2 用户群体简介 361 13.3 十条箴言 363 主要参考资料... 365
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值