[转]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相关推荐

  1. 魔兽mdx文件导出为Ogre Mesh的小进展

    最近一直在试图把魔兽3的mdx文件转为Ogre Mesh,学习一下基础的3D编程.Ogre Mesh的导出在很久之前也曾试图做过,并且还把WOW的m2模型以及WMO模型导入到了Max中,但是只做到了骨 ...

  2. VC++读取AVi视频文件

    头文件 #include <Vfw.h> 成员变量: // for avi; PGETFRAME Frame; BITMAPFILEHEADER BMPFileHeader; PAVIFI ...

  3. 天龙 - Terrain

    研究方法:我们通过场景加载入口函数EnterScene一步一步推导出<天龙八部>地形系统的具体结构. 1.一个地形场景所需的文件有下面这些:(以苏州为例) suzhou.GridInfo ...

  4. 《天龙八部》地形研究

    研究方法:我们通过场景加载入口函数EnterScene一步一步推导出<天龙八部>地形系统的具体结构. 1.一个地形场景所需的文件有下面这些:(以苏州为例) suzhou.GridInfo ...

  5. 《天龙八部》地形研究-1

    研究方法:我们通过场景加载入口函数EnterScene一步一步推导出<天龙八部>地形系统的具体结构. 1.一个地形场景所需的文件有下面这些:(以苏州为例) suzhou.GridInfo ...

  6. Ogre3D Mesh转换到FBX格式

    在做一个Ogre3d 模型和骨骼动画转换到FBX格式的工具.中间遇到种种问题,下面将主要思路记录下来. 转换Mesh比较简单,就是遍历MeshPtr,获取顶点和索引缓冲.获取UV坐标,然后按FBX S ...

  7. chap6_2 Parallax mapping in OGRE

    Parallax mapping(视差映射)是凹凸映射的一种,同样,这里只是在OGRE里面实现,不讲原理.我会写个DX版本的parallax mappiing,到时候再讲原理,敬请期待! /*---- ...

  8. ogre 学习笔记 - Day 7

    ogre 学习笔记 - Day 7 [Sample_ParticleFX] 粒子效果 void setupParticles(){ParticleSystem::setDefaultNonVisibl ...

  9. Ogre天龙八部地形mesh部分的C++源码

    Ogre的地形部分历来受人诟病,基本没什么用.听说将来的的Ogre1.7版本会重写地形.期待中... 在没有合适的地形可用的情况下,自己手动生成mesh来当地形是一个不错的选择. 由于很多人问我天龙八 ...

  10. OGRE 1.8 Animation ,动画部分

    本系列文章认为你懂得C++ stl的设计概念和设计模式,当然c++你要是压根不会就直接闪人吧.懂点boost最好,Ogre也用了这个.计算机图形学怎么说也得懂点吧?要不然四元数都够你郁闷的了.mesh ...

最新文章

  1. CakePHP中出现persistent is not writable等Warning的解决方法
  2. 有赞融资10亿港元 腾讯领投加紧布局产业互联网
  3. 箭头函数中的this
  4. 【C++ 语言】 C 与 C++ 兼容 ( extern C )
  5. java 导出excel二维表,如何轻松将EXCEL二维统计表转为数据清单?
  6. 看到go语言简介想到的
  7. 装13失败后,我决定使用Python为生僻字批量注音
  8. 特斯拉:召回不涉及国产车型 也与“刹车失灵”无关
  9. AMQP Connection 127.0.0.1:5672] ERROR [o.s.a.rabbit.connection.CachingConnectionFactory] CachingConn
  10. How to stop looking for someone perfect and find someone to love
  11. MySql常用函数汇总
  12. ofd文件怎么打开?怎么转换成pdf格式发票?ofd文件打开教程
  13. 北京系统集成项目经理考前培训
  14. 沟通的艺术与处世智慧 ——戴尔卡耐基(笔记)
  15. html5 css3时间特效,炫酷纯CSS3响应式垂直时间轴特效
  16. 手机连接电脑热点 显示 连接超时,已解决
  17. 这篇文章教给你图片怎么去雾的几个方法
  18. c语言定义禁止优化变量,c语言防止优化
  19. 记录自己第一次科研经历
  20. 王半仙儿的日记-0010——“在人生的十字路口,没有人会迷茫,但有人会胆怯。勤奋成就万事。”

热门文章

  1. SqlSessionFactory和SqlSessionTemplate
  2. 47. 避免产生直写型(write-only)的代码
  3. 02. 不要试图编写独立于容器类型的代码
  4. .net excel循环插数据_[PaperReading]MEMC-Net 运动估计和运动补偿网络
  5. linux创建进程 api,.net Core 3.0 WebApi 创建Linux守护进程的方法
  6. mysql主从复制1064_mysql主从复制或其他操作报错ERROR 1064 (42000): You have an er
  7. 根据经纬度计算两点间的距离_全班学生被此奥数题难倒,理解两点间距离公式的几何意义是关键...
  8. python安装选项_Python PyInstaller安装和使用教程(详解版)
  9. jack插头_防水连接器航空插头特点
  10. as工程放到源码编译_「Do.016」AndroidStudio不用编译,阅读Android源码