ogre3D学习基础4 -- 网格工具与硬件缓存
三、网格工具(Mesh)
1、导出器(Exporters)--- 用于从模型生成器中得到数据并且导入到OGRE中去。
导出器是指通过3D模型工具的插件写成网格数据和骨骼动画的文件格式可以在OGRE中被实时渲染(这句话读着太吃力了)。这些文件被导出器以.mesh和.skeleton形式生成。
2、XML转换器(XmlConverter)--- 用于从XML转换网格数据和骨骼数据 。
格式:OgreXMLConverter sourcefile [destfile]
3、网格数据更新器(MeshUpgrader)---用于从OGRE其中之一的版本更新二进制网格数据到其他的版本中。
格式:OgreMeshUpgrade <oldmesh> <newmesh>
四、硬件缓存
硬件缓存就是一块普通的存储区域,只不过它存在于GPU或者AGP的储存区域。
唯一需要记住的是如果要建立缓存对象就一定要通过HardwareBufferManager类,而不要简单的通过“new”操作.
1、缓存加锁
//“锁”全部的缓存区域
pBuffer->lock(lockType);
//“锁”缓存中的一部分区域
pBuffer->lock(start, length, lockType);
其中lockType参数有HBL_NORMAL,HBL_READ_ONLY,HBL_DISCARD,_HBL_NO_OVERWRITE
2、VertexData类
VertexData类保存了所有和顶点有关的信息。每次新的渲染操作都需要一个指向VertexData对象的指针,同时它也可以用被模型(Mesh)和子模型(SubMesh)来储存顶点位置、法线以及纹理坐标等数据。VertexData既可以被单独使用(被用来作为三角形流数据来渲染无索引的几何体),或者和索引数据结合来产生完整的顶点数据。
VertexData类中所包含的一些重要成员
vertexStart ---- 顶点数据在缓存中开始的位置。通过这个成员可以允许你使用同用一个缓存来进行多个不同的渲染。
vertexCount ---- 当前渲染组中所需要处理的顶点的数量。
vertexDeclaration ---- 一个指向 VertexDeclaration对象的指针,用来标示输入顶点数据的格式。
3、顶点声明
顶点声明定义了渲染屏幕上几何体所需要输入的顶点数据。
VertexDeclaration对象的参数
source --- 这个参数告诉声明这个元素针对哪个缓存使用。
offset --- 这个参数告诉声明这个元素在缓存中的每个顶点中具体的偏移量(bytes)。
type --- 这个参数被用来定义新元素的具体类型,同时包括它的尺寸。
semantic --- 这个参数定义了当前元素的具体操作 - GPU将使用这个参数来确定当前输入被用于什么地方,并且可编程顶点管线将要使用这个参数来确定具体要输入到哪个语义中去 。可以设置数据的语义包括“位置数据”、“法线数据”或者“纹理坐标数据”等等。
index --- 这个参数只会在你在同一个元素中配制了多个相同语义的元素是有产生作用。
4、顶点缓存绑定
顶点缓存绑定指的是通过顶点声明来把顶点缓存和资源索引结合到一起。
创建顶点缓存
HardwareVertexBufferSharedPtr vbuf =
HardwareBufferManager::getSingleton().createVertexBuffer(
3*sizeof(Real), // 整个一个顶点在缓存中的byte尺寸
numVertices, //缓存中的顶点数量
HardwareBuffer::HBU_STATIC_WRITE_ONLY, // 如何使用这块缓存
false); // 是否需要一分系统内存的缓存拷贝
绑定顶点缓存
vertexBufferBinding->setBinding(0, vbuf);
更新顶点缓存
更新顶点缓存的复杂性完全取决于之前如何配置里面的内容。
5、IndexData类
概述了渲染几何体索引集合所需要的信息。其中的成员包括:
indexStart --- 这个几何体片断所使用的第一个索引;这个成员对于在多个几何体片断中共享单独一个单独的索引缓存十分有用。
indexCount --- 这个可渲染物体中使用索引的数量。
indexBuffer --- 提供所需索引的具体索引缓存。
6、硬件像素缓存
硬件像素缓存是一种储存在显示卡硬件内存中特殊图形数据的类型,通常被用来作为纹理使用。像素缓存可以用来保存一维、二维或者三维图形。
纹理 --- 所谓纹理,就是一张可以应用在空间模型表面的图像。在Ogre中,纹理被描述成Texture resource类型.
创建一个纹理 --- 纹理通过纹理管理器TextureManager创建。
PixelBuffer(像素缓存)-- 一个纹理可以包含众多的PixelBuffer像素缓存,其中的每一个都对应着不同的mipmap等级和表面号码(face number)。
更新像素缓存 -- 通过PixelBox对象(像素盒)实现
PixelBox对象
成员变量
data 内存中这个图像数据的首指针。
format 这个图像数据的像素格式 .
rowPitch 相邻两行最左边像素之间元素的数量,对于压缩格式来说,这个值总是等于getWidth()。
slicePitch 相邻两层最左上角像素之间元素的数量,对于压缩格式来说,这个值总是等于getWidth()*getHeight()。
left, top, right, bottom, front, back
7、 外部纹理源
一个纹理的来源可以使任何东西——png,bmp,jpeg等等。对于从普通的图片类型中载入纹理的工作仍然是Ogre本身来处理的,而对于从其它的纹理来源,包括mpeg/avi等电影格式文件,flash文件,实时产生的来源,用户自定义来源等,被称为外部纹理源。
注意 :
对于OGRE在创建一个动画模型时的规则:
1、每个顶点你必须没有超过4的加权骨骼赋值。如果你超过了,OGRE将会删去最低的加权赋值并且重新规格化为其他权重。这些限制是由硬件混合局限性强加的。
2、所有的的顶点都必须被分配到至少一个骨骼点上 -- 分配静态顶点到根部骨骼点。
3、在动画开始和结束时最少每个骨骼点上必须有一个关键帧。
ogre3D学习基础4 -- 网格工具与硬件缓存的更多相关文章
- ogre3D学习基础5 -- 阴影与动画
五.阴影 阴影是渲染一个真实场景的重要组成部分,它可以给场景中的物体提供更加真实的感觉,同时还可以帮助用户更好的了解对象间的空间关系. 启用阴影: 缺省情况下,阴影是关闭的,开启方式如下: 1.建立场 ...
- ogre3D学习基础1 -- 核心对象与脚本技术
一.核心对象介绍1.命名空间 Ogre3d使用了C++的特性--命名空间,可以防止命名混淆.使用方法也简单,using namespace Ogre;或者直接在使用时加上“Ogre::”的前缀,如Og ...
- ogre3D学习基础19 --- 材质的继承,纹理的滚动与旋转
以上一节为基础,废话不多说. 首先新增一个节点,用于比较显示 //新增一个节点 ent = mSceneMgr->createEntity("Quad"); ent-> ...
- ogre3D学习基础18 -- 材质的使用与脚本的简单书写
这一节以基础16为基础,练习材质的使用. 第一,看看框架 //material #include "ExampleApplication.h" class TutorialAppl ...
- ogre3D学习基础13 -- 键盘控制网格动画mesh
以上一节为蓝本,这里增加一点难度,添加了四个节点,增加键盘控制移动速度,使用bool变量控制是否移动. 第一,要增加键盘控制,那就使用OIS::KeyListener,在监听器里添加一个父类KeyLi ...
- ogre3D学习基础12 --- 让机器人动起来(移动模型动画)
学了那么长时间,才学会跑起来.My Ogre,动起来. 第一,还是要把框架搭起来,这里我们用到双端队列deque,前面已经简单介绍过,头文件如下: #include "ExampleAppl ...
- ogre3D学习基础11 -- 交换两个场景管理器
这一节,练习一下前几次学习的内容,功能很简单,就是建立两个不同的场景管理器,当按下键盘上某个键时切换镜头. 基本框架不变,这个监听器继承了两个父类,一个是我们的老朋友ExampleFrameListe ...
- ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)
要实现键盘,鼠标对场景的控制,首先要帧监听,就是在每一帧的渲染前后对它进行操作.这里的操作没有用到缓冲区,只是简单的直接获取. 1.这些步骤和前面的一样,直接上代码,操作还是在createScene函 ...
- ogre3D学习基础9 -- 光源程序实例
这一章练习一下光源的使用,光源分为三种:点光源,聚光源,有向光.具体内容前面说过,这里就不解释了. 继续在上一章的程序的基础上实现. 1.创建摄像机(Camera) createCamera()函数是 ...
随机推荐
- zabbix中监控项报错
报错信息: zabbix报错(Not all processes could be identified, non-owned process info will not be shown, you ...
- graylog插件的安装
什么是插件和插件的作用我就不说了,大家应该都知道了. 安装方法是打开下面选择项 进去后出现如下界面 选择事先下载好的插件后,点击上传.这里以nginx日志插件为例 之后查看效果,发现对应的过滤 ...
- 再次尝试windows下msys+MinGW编译ffmpeg
电脑上安装太多的开源库,环境变量里面一些常用的头文件都有几种,以前使用的编译ffmpeg的方法现在常常提示错误.从config.log中看,这些错误往往都是一些头文件引用错误导致.由于项目中继续编译自 ...
- 用JavaScript访问SAP云平台上的服务遇到跨域问题该怎么办
关于JavaScript的跨域问题(Cross Domain)的讨论, 网上有太多的资源了.国内的程序猿写了非常多的优秀文章,Jerry这里就不再重复了. 直入主题,最近我正在做一个原型开发:通过SA ...
- NYOJ-596-谁是最好的Coder
原题链接 谁是最好的Coder 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描述 计科班有很多Coder,帅帅想知道自己是不是综合实力最强的coder. 帅帅喜欢帅,所以他 ...
- hdu-2066 一个人的旅行---模板题
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2066 题目大意: 求到目标点集合中的最短距离 解题思路: dijkstra算法求出每个点到该点的最短 ...
- 【BZOJ1216】[HNOI2003] 操作系统(堆+模拟)
点此看题面 大致题意: 有\(n\)个任务,每个任务有4个属性:编号.到达时间.执行时间和优先级.每个单位时间,会执行一个优先级最高(若有多个优先级最高的,就先执行到达时间较早的)的任务,请你按完成的 ...
- Linux一键脚本合集vps
首先,想说说一键脚本流行的原因何在? 众所周知的是,Linux 是占据大半壁江山的服务器系统,但在桌面上的占有率可就远不是那么回事儿了,使用和熟悉 Linux 的人远没有 Windows 多,但又因为 ...
- AngularJs学习笔记-服务
服务 (1)在模块中声明的服务对所有组件可见 (2)在组件中声明的服务对自己本身和其子组件 (3)在组件中声明的服务会覆盖在模块中声明的服务 (4)通过@Injectable()装饰器可以在服务中注入 ...
- InstallShield Limited Edition for Visual Studio 2013 图文教程打包安装包
http://www.wuleba.com/23892.html 从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而让大家去安装使用第三方的打包工具“Inst ...