索引缓冲器对象能够被应用程序直接访问其分配的内存。通过调用"IDirect3DIndexBuffer8::Lock"方法你可以得到一个指向索引缓冲内存的指针,然后访问这块内存区:填充新的索引数据或者读取任何其中的数据。”Lock”方法接受四个参数。第一个参数”OffsetToLock”是索引数据的偏移。第二个参数是索引数据的尺寸,其单位是字节。第三个参数”ppbData”被”Lock”方法使用,如果函数调用成功,其指向的地址被填充为索引数据的指针地址。
最后个参数”Flags”告诉系统如何缩定(Lock)住内存。你能使用它来表明你的应用程序将如何访问索引数据。”Flags”详细的数值依赖应用程序访问的方式,这样将允许驱动器(DirectX)执行最好的访问方式。如果你的应用程序只读取数据,使用D3DLOCK_READONLY标志;包含这个标志能够使得Microsoft?Direct3D?优化其内在的手续以提高效率并只给予内存只读权限。
在你填充或读取望索引数据后,调用”IDirect3DindexBuffer8::Unlock”方法。下面是示范代码:
// 这个示范代码假定IB的类型可变
// LPDIRECT3DINDEXBUFFER8 和 g_Indices 已经被适当的初始化
// 为力填充索引数据,你必须锁定缓冲区以获得访问权限。
// 这个机制是必须的,因为索引数据可能在显存里(显存不可直接访问?-lzp)
VOID* pIndices;
if( FAILED( IB-Lock( 0, // 填充缓冲的其始位置
sizeof(g_Indices), // 填充的数据尺寸
(BYTE**)&pIndices, // 返回数据地址
0 ) ) ) // 使用默认标志
return E_FAIL;
memcpy( pIndices, g_Indices, sizeof(g_Indices) );
IB-Unlock();
注意:
如果你通过D3DUSAGE_WRITEONLY标志创建的索引缓冲器,不要使用D3DLOCK_READONLY标志锁定。如果你的程序只从索引缓冲器读取数据,使用D3DLOCK_READONLY标志可以使得Direct3D优化内部的手续以提高效率并只给予只读访问权限。
参阅”Using Dynamic Vertex and Index Buffers”得到在调用”Lock”方法中如何使用D3DLOCK_DISCARD或D3DLOCK_NOOVERWRITE标志。
在C++中,由于直接访问分配的索引缓冲区,你要确定你的程序适当的访问分配的内存,否则,你冒着渲染无效内存的风险。在你的程序从一个索引缓冲区移动数据是请使用索引格式的跨度
得到缓冲器描述
通过调用”IDirect3DindexBuffer8::GetDesc”得到缓冲器描述。这个方法填充顶点缓冲器的信息到结构体”D3DINDEXBUFFER_DESC”中.
原文:DirextX 8.1 C++ helpDirectX GraphicsProgrammers GuideAdvanced TopicsObject GeometryIndex BuffersAccess the Contents of an Index Buffer