- Ogre中的硬件缓存是指在显卡上的存储,这和在内存上的存储一样是可以访问的。有三种硬件缓存:HardwareVertexBuffer(顶点缓存,存储顶点的各种数据)、HardwareIndexBuffer(索引缓存,存储一个mesh的面片的顶点索引),HardwarePixelBuffer(纹理缓存,存储某个纹理贴图的数据)。这些数据在程序运行时都在显卡的存储上,然而你可以去读和写这些数据,来操控程序中物体的形状、纹理等。这个用处是非常大的。在Ogre中与访问这些硬件缓存有关的类及他们相互间的关系如下图:
- 根据这个图进行解释
- 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 =