版权声明:转载请注明出处 https://blog.csdn.net/weixin_39918693/article/details/88693920
文章目录
1、顶点缓存与索引缓存
顶点缓存
是一个包含顶点数据的连续存储空间
;索引缓存
是一个包含索引数据的连续存储空间
我们之所以用顶点缓存和索引缓存而非数组来存储数据,是因为顶点缓存和索引缓存可以被放置在显存(video memory)中
。进行绘制时,使用显存中的数据将获得比使用系统内存中的数据快得多的绘制速度。这里所说的并不是读写速度
1.1、创建顶点缓存和索引缓存
HRESULT IDirect3DDevice9::CreateVertexBuffer(
UINT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool,
IDirect3DVertexBuffer9 **ppVertexBuffer,
HANDLE *pShareHandle
);
HRESULT IDirect3DDevice9::CreateIndexBuffer(
UINT Length,
DWORD Usage,
D3DFORMAT Format,
D3DPOOL Pool,
IDirect3DIndexBuffer9 **ppIndexBuffer,
HANDLE *pShareHandle
);
- 1、
显存(静态缓存)
:绘制速度快,读写速度慢,一般是在应用程序初始化时用几何体的数据进行填充 - 2、
AGP存储区(动态缓存)
:绘制速度慢,因为绘制前要将数据传输到显存中,读操作慢,写操作快 - 3、
系统内存
:读操作快
1.2、访问缓存内容
为了访问顶点缓存或索引缓存中的数据,我们需要获得指向缓存内容的指针
HRESULT IDirect3DVertexBuffer9::Lock(
UINT OffsetToLock,
UINT SizeToLock,
BYTE **ppbData,
DWORD Flags
);
HRESULT IDirect3DIndexBuffer9::Lock(
UINT OffsetToLock,
UINT SizeToLock,
BYTE **ppbData,
DWORD Flags
);
Flag中的D3DLOCK_DISCARD和D3DLOCK_NOOVERWRITE
表明缓存区的某一部分在锁定之后可以使用(用于绘制)。如果环境(硬件配置)允许使用这些标记,在对缓存进行锁定时,其他的显示操作就不会中断
操作完成之后,要进行解锁操作
1.3、获取顶点缓存和索引缓存的信息
可以使用相应的结构体来获取相应缓存的信息
2、绘制状态
Direct3D封装了多种绘制状态(rendering state)
,这些绘制状态将影响几何体的绘制方式
各种绘制状态均有默认值
,只有在需要修改的时候才建议去修改
HRESULT IDirect3DDevice9::SetRenderState(
D3DRENDERSTATETYPE State,
DWORD Value
);
3、绘制的准备工作
- 1、指定数据流输入源
HRESULT IDirect3DDevice9::SetStreamSource(
UINT StreamNumber,
IDirect3DVertexBuffer9 *pStreamData,
UINT OffsetInBytes,
UINT Stride
);
- 2、设置顶点格式
Device->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
- 3、设置索引缓存
Device->SetIndices(ib);
任意时刻只允许使用一个索引缓存
,如果要用一个不同的索引缓存绘制物体时,必须进行切换
4、使用顶点缓存和索引缓存进行绘制
前期工作完成后,就可以使用DrawPrimitive或DrawIndexedPrimitive方法
将待绘几何体的信息通过绘制流水线传输
。这两个方法从顶点数据流中获取顶点信息,并从当前设定的索引缓存中提取索引信息
- 1、用于绘制未使用索引信息的图元
HRESULT IDirect3DDevice9::DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex,
UINT PrimitiveCount
);
- 2、用于绘制使用了索引信息的图元
HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type,
INT BaseVertexIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);
所有的绘制方法都必须在IDirect3DDevice9::BeginScene和IDirect3DDevice9::EndScene构成的方法对之间进行调用
5、D3DX几何体
在代码中通过构建三角形单元而进一步构建3D物体是十分繁琐的,而且没有实用价值
使用D3DXCreate*
生成相应的网格数据,然后使用ID3DXMesh::DrawSubset函数
对其进行绘制