[转]Ogre:Hardwarebuffer
[转]Ogre:Hardwarebuffer
关键字:
Ogre中的硬件缓存是指在显卡上的存储,这和在内存上的存储一样是可以访问的。有三种硬件缓存:HardwareVertexBuffer(顶点缓存,存储顶点的各种数据)、HardwareIndexBuffer(索引缓存,存储一个mesh的面片的顶点索引),HardwarePixelBuffer(纹理缓存,存储某个纹理贴图的数据)。这些数据在程序运行时都在显卡的存储上,然而你可以去读和写这些数据,来操控程序中物体的形状、纹理等。这个用处是非常大的。
1、最上面的hardwarevertexbuffer 读写:如果mesh使用的所有子mesh共享buffer的形式,则用mesh的sharedvertexdata,否则用submesh的vertexdata来得到vertexdata结构,vertexdata封装了对该mesh的顶点缓存数据的访问方式,但是却不直接包含这些顶点缓存数据。vertexdata中的vettexbufferbinding可以知道当前的vertexdata对应了确切的硬件上的哪块buffer,可以通过vettexbufferbinding的getBuffer确切的得到该顶点缓存,而vertexdata中的vertexdeclaration则是一个对他对应的buffer进行各种访问的接口,里面有访问的格式等。如果要开始操纵这个buffer,需要将getbuffer得到的hardwarevertexbuffer调用lock,然后将这片缓存上锁,这个lock返回了一个void指针,指向的就是缓存数据。拿着这个指针就可以读取改写等
创建:使用hardwarebuffermanager的create来创建,创建后利用hardwarevertexbuffer的write写入数据
2.中间的hardwareindexbuffer 读写:直接使用submesh的indexdata来得到一个indexdata结构,再调用它的hardwareindexbuffer的来得到这个顶点缓存,童年顶点缓存一样再调用lock来进行读写操作创建:同顶点缓存
3最下面的hardwarepixelbuffer
读写:从texture中可以直接得到这个hardwarepixelbuffer,然后对它lock后就可以得到一个pixelbox的数据,pixebox封装了所有纹理数据及其各种属性信息
创建:texture是由texturemanager创建的
下面是一些具体的使用硬件缓存的例子
读取顶点和索引缓存
Ogre::MeshPtr meshPtr=mainEntity->getMesh(); //假设这里使用的是share的形式 Ogre::VertexData* vertex_data=meshPtr->sharedVertexData;
//得到位置数据的信息 const Ogre::VertexElement* posElem =vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION);
//得到纹理坐标数据的信息 const Ogre::VertexElement*texcoElem=vertex_data->vertexDeclaration->findElementBySemantic(Ogre::VES_TEXTURE_COORDINATES);
//得到位置和纹理的缓存
Ogre::HardwareVertexBufferSharedPtr posBuf=vertex_data->vertexBufferBinding->getBuffer(posElem->getSource()); Ogre::HardwareVertexBufferSharedPtr texcoBuf=vertex_data->vertexBufferBinding->getBuffer(texcoElem->getSource());
//顶点位置缓存的lock,读取 unsigned char* vertexPos =static_cast<unsignedchar*>(posBuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY));
//将第一个点的位置读出 float* pReal;
//这个函数的作用是将当前vertexPos指向的数据用其他型(这里是float*)的指针指向,这样读出来的数据就是float型的了,或者用float型的数据进行写入
posElem->baseVertexPointerToElement(vertexPos, &pReal);
Ogre::Vector3 pt(pReal[0], pReal[1], pReal[2]);
//访问之后要上锁 posBuf->unlock();
//读取索引信息 Ogre::SubMesh* submesh = meshPtr->getSubMesh( i );
//得到这个submesh的indexdata Ogre::IndexData* index_data = submesh->indexData; int numTris = index_data->indexCount / 3;
//得到indexbuffer Ogre::HardwareIndexBufferSharedPtr ibuf = index_data->indexBuffer; bool use32bitindexes = (ibuf->getType() ==Ogre::HardwareIndexBuffer::IT_32BIT);
//得到具体的索引缓存数据 unsigned long* pLong = static_cast<unsignedlong*>(ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY)); unsigned short* pShort = reinterpret_cast<unsigned short*>(pLong);
… … ibuf->unlock();
访问纹理缓存
Ogre::HardwarePixelBufferSharedPtrcrossPixbufferPtr=texture.getPointer()->getBuffer(0,0);
crossPixbufferPtr->lock(Ogre::HardwareBuffer::HBL_NORMAL);
Ogre::PixelBox pb=crossPixbufferPtr->getCurrentLock();
int height = pb.getHeight();
int width = pb.getWidth();
int pitch = pb.rowPitch;
// Skip between rows of image uint32* data=static_cast<uint32*>(pb.data);
……操纵data…… crossPixbufferPtr->unlock();
创建顶点缓存和索引缓存,进而根据其创建一个自定义的mesh
void createColourCube()
{
/// Create the mesh via the MeshManager Ogre::MeshPtr msh =MeshManager::getSingleton().createManual("ColourCube","General");
/// Create one submesh SubMesh* sub = msh->createSubMesh();
const float sqrt13 = 0.577350269f;
/* sqrt(1/3) */
/// Define the vertices (8 vertices, each consisting of 2 groups of 3 floats const size_t nVertices = 8;
const size_t vbufCount = 3*2*nVertices;
float vertices[vbufCount] = { -100.0,100.0,-100.0, //0 position -sqrt13,sqrt13,-sqrt13,
//0 normal 100.0,100.0,-100.0,
//1 position sqrt13,sqrt13,-sqrt13,
//1 normal 100.0,-100.0,-100.0,
//2 position sqrt13,-sqrt13,-sqrt13,
//2 normal -100.0,-100.0,-100.0,
//3 position -sqrt13,-sqrt13,-sqrt13,
//3 normal -100.0,100.0,100.0,
//4 position -sqrt13,sqrt13,sqrt13,
//4 normal 100.0,100.0,100.0,
//5 position sqrt13,sqrt13,sqrt13,
//5 normal 100.0,-100.0,100.0,
//6 position sqrt13,-sqrt13,sqrt13,
//6 normal -100.0,-100.0,100.0,
//7 position -sqrt13,-sqrt13,sqrt13,
//7 normal };
RenderSystem* rs = Root::getSingleton().getRenderSystem();
RGBA colours[nVertices]; RGBA *pColour = colours;
// Use render system to convert colour value since colour packing varies rs->convertColourValue(ColourValue(1.0,0.0,0.0), pColour++);
//0 colour rs->convertColourValue(ColourValue(1.0,1.0,0.0), pColour++);
//1 colour rs->convertColourValue(ColourValue(0.0,1.0,0.0), pColour++);
//2 colour rs->convertColourValue(ColourValue(0.0,0.0,0.0), pColour++);
//3 colour rs->convertColourValue(ColourValue(1.0,0.0,1.0), pColour++);
//4 colour rs->convertColourValue(ColourValue(1.0,1.0,1.0), pColour++);
//5 colour rs->convertColourValue(ColourValue(0.0,1.0,1.0), pColour++);
//6 colour rs->convertColourValue(ColourValue(0.0,0.0,1.0), pColour++);
//7 colour
/// Define 12 triangles (two triangles per cube face) ///
The values in this table refer to vertices in the above table
const size_t ibufCount = 36;
unsigned short faces[ibufCount] = { 0,2,3, 0,1,2, 1,6,2, 1,5,6, 4,6,5, 4,7,6, 0,7,4, 0,3,7, 0,5,1, 0,4,5, 2,7,3, 2,6,7 };
/// Create vertex data structure for 8 vertices shared between submeshes
msh->sharedVertexData = new VertexData();
msh->sharedVertexData->vertexCount = nVertices; /
// Create declaration (memory format) of vertex data
VertexDeclaration* decl = msh->sharedVertexData->vertexDeclaration;
size_t offset = 0;
// 1st buffer
decl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
offset += VertexElement::getTypeSize(VET_FLOAT3);
decl->addElement(0, offset, VET_FLOAT3, VES_NORMAL);
offset += VertexElement::getTypeSize(VET_FLOAT3);
/// Allocate vertex buffer of the requested number of vertices (vertexCount)
/// and bytes per vertex (offset)
HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton().createVertexBuffer( offset, msh->sharedVertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY);
/// Upload the vertex data to the card
vbuf->writeData(0, vbuf->getSizeInBytes(), vertices, true);
/// Set vertex buffer binding so buffer 0 is bound to our vertex buffer
VertexBufferBinding* bind = msh->sharedVertexData->vertexBufferBinding;
bind->setBinding(0, vbuf);
// 2nd buffer
offset = 0;
decl->addElement(1, offset, VET_COLOUR, VES_DIFFUSE);
offset += VertexElement::getTypeSize(VET_COLOUR);
/// Allocate vertex buffer of the requested number of vertices (vertexCount)
/// and bytes per vertex (offset)
vbuf = HardwareBufferManager::getSingleton().createVertexBuffer( offset, msh->sharedVertexData->vertexCount,HardwareBuffer::HBU_STATIC_WRITE_ONLY);
/// Upload the vertex data to the card
vbuf->writeData(0, vbuf->getSizeInBytes(), colours, true);
/// Set vertex buffer binding so buffer 1 is bound to our colour buffer
bind->setBinding(1, vbuf);
/// Allocate index buffer of the requested number of vertices (ibufCount)
HardwareIndexBufferSharedPtr ibuf = HardwareBufferManager::getSingleton(). createIndexBuffer( HardwareIndexBuffer::IT_16BIT, ibufCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY);
/// Upload the index data to the card
ibuf->writeData(0, ibuf->getSizeInBytes(), faces, true);
/// Set parameters of the submesh
sub->useSharedVertices = true;
sub->indexData->indexBuffer = ibuf;
sub->indexData->indexCount = ibufCount;
sub->indexData->indexStart = 0;
// Set bounding information (for culling)
msh->_setBounds(AxisAlignedBox(-100,-100,-100,100,100,100));
msh->_setBoundingSphereRadius(Math::Sqrt(3*100*100));
/// Notify -Mesh object that it has been loaded
msh->load();
}
然后可以从mesh直接创建entity放在场景中
Entity*thisEntity =sceneManager->createEntity("cc", "ColourCube");
转载于:https://www.cnblogs.com/zcj0620/archive/2013/04/20/3032569.html
[转]Ogre:Hardwarebuffer相关推荐
- 魔兽mdx文件导出为Ogre Mesh的小进展
最近一直在试图把魔兽3的mdx文件转为Ogre Mesh,学习一下基础的3D编程.Ogre Mesh的导出在很久之前也曾试图做过,并且还把WOW的m2模型以及WMO模型导入到了Max中,但是只做到了骨 ...
- VC++读取AVi视频文件
头文件 #include <Vfw.h> 成员变量: // for avi; PGETFRAME Frame; BITMAPFILEHEADER BMPFileHeader; PAVIFI ...
- 天龙 - Terrain
研究方法:我们通过场景加载入口函数EnterScene一步一步推导出<天龙八部>地形系统的具体结构. 1.一个地形场景所需的文件有下面这些:(以苏州为例) suzhou.GridInfo ...
- 《天龙八部》地形研究
研究方法:我们通过场景加载入口函数EnterScene一步一步推导出<天龙八部>地形系统的具体结构. 1.一个地形场景所需的文件有下面这些:(以苏州为例) suzhou.GridInfo ...
- 《天龙八部》地形研究-1
研究方法:我们通过场景加载入口函数EnterScene一步一步推导出<天龙八部>地形系统的具体结构. 1.一个地形场景所需的文件有下面这些:(以苏州为例) suzhou.GridInfo ...
- Ogre3D Mesh转换到FBX格式
在做一个Ogre3d 模型和骨骼动画转换到FBX格式的工具.中间遇到种种问题,下面将主要思路记录下来. 转换Mesh比较简单,就是遍历MeshPtr,获取顶点和索引缓冲.获取UV坐标,然后按FBX S ...
- chap6_2 Parallax mapping in OGRE
Parallax mapping(视差映射)是凹凸映射的一种,同样,这里只是在OGRE里面实现,不讲原理.我会写个DX版本的parallax mappiing,到时候再讲原理,敬请期待! /*---- ...
- ogre 学习笔记 - Day 7
ogre 学习笔记 - Day 7 [Sample_ParticleFX] 粒子效果 void setupParticles(){ParticleSystem::setDefaultNonVisibl ...
- Ogre天龙八部地形mesh部分的C++源码
Ogre的地形部分历来受人诟病,基本没什么用.听说将来的的Ogre1.7版本会重写地形.期待中... 在没有合适的地形可用的情况下,自己手动生成mesh来当地形是一个不错的选择. 由于很多人问我天龙八 ...
- OGRE 1.8 Animation ,动画部分
本系列文章认为你懂得C++ stl的设计概念和设计模式,当然c++你要是压根不会就直接闪人吧.懂点boost最好,Ogre也用了这个.计算机图形学怎么说也得懂点吧?要不然四元数都够你郁闷的了.mesh ...
最新文章
- CakePHP中出现persistent is not writable等Warning的解决方法
- 有赞融资10亿港元 腾讯领投加紧布局产业互联网
- 箭头函数中的this
- 【C++ 语言】 C 与 C++ 兼容 ( extern C )
- java 导出excel二维表,如何轻松将EXCEL二维统计表转为数据清单?
- 看到go语言简介想到的
- 装13失败后,我决定使用Python为生僻字批量注音
- 特斯拉:召回不涉及国产车型 也与“刹车失灵”无关
- AMQP Connection 127.0.0.1:5672] ERROR [o.s.a.rabbit.connection.CachingConnectionFactory] CachingConn
- How to stop looking for someone perfect and find someone to love
- MySql常用函数汇总
- ofd文件怎么打开?怎么转换成pdf格式发票?ofd文件打开教程
- 北京系统集成项目经理考前培训
- 沟通的艺术与处世智慧 ——戴尔卡耐基(笔记)
- html5 css3时间特效,炫酷纯CSS3响应式垂直时间轴特效
- 手机连接电脑热点 显示 连接超时,已解决
- 这篇文章教给你图片怎么去雾的几个方法
- c语言定义禁止优化变量,c语言防止优化
- 记录自己第一次科研经历
- 王半仙儿的日记-0010——“在人生的十字路口,没有人会迷茫,但有人会胆怯。勤奋成就万事。”
热门文章
- SqlSessionFactory和SqlSessionTemplate
- 47. 避免产生直写型(write-only)的代码
- 02. 不要试图编写独立于容器类型的代码
- .net excel循环插数据_[PaperReading]MEMC-Net 运动估计和运动补偿网络
- linux创建进程 api,.net Core 3.0 WebApi 创建Linux守护进程的方法
- mysql主从复制1064_mysql主从复制或其他操作报错ERROR 1064 (42000): You have an er
- 根据经纬度计算两点间的距离_全班学生被此奥数题难倒,理解两点间距离公式的几何意义是关键...
- python安装选项_Python PyInstaller安装和使用教程(详解版)
- jack插头_防水连接器航空插头特点
- as工程放到源码编译_「Do.016」AndroidStudio不用编译,阅读Android源码