1直接使用vertex buffer绘制
使用IDirect3DDevice9::DrawPrimitive绘制
HRESULT DrawPrimitive(
[in] D3DPRIMITIVETYPE PrimitiveType,--原语类型
[in] UINT StartVertex,--顶点缓存中第一个顶点的index
[in] UINT PrimitiveCount --绘制的原语的数量(注意不是顶点的数量)最大值查询D3DCAPS9
);
2. 配合indice绘制
3.0顶点buffer
struct CUSTOMVERTEX
{
float x,y,z;--先定义顶点的数据结构,这里就是三维位置,还可以定义材质、贴图、法向等
};
CUSTOMVERTEX Vertices[] =
{
{-5.0, -5.0, 0.0},
{ 0.0, 5.0, 0.0},
{ 5.0, -5.0, 0.0},
{10.0, 5.0, 0.0},
{15.0, -5.0, 0.0},
{20.0, 5.0, 0.0}
};
3.1原语
D3DPT_POINTLIST 点集
D3DPT_LINELIST 孤立的线集
D3DPT_LINESTRIP 首尾连接的线
D3DPT_TRIANGLELIST 孤立三角形集
D3DPT_TRIANGLESTRIP
D3DPT_TRIANGLEFAN
3.2 clear
使用IDirect3DDevice9::Clear( [in] DWORD Count,--rect的数量
[in] const D3DRECT *pRects, --窗口内清除的矩形区域,可以有多个,null代表整个窗口,此时上面要用0
[in] DWORD Flags,--清楚的surface标志
D3DCLEAR_STENCIL D3DCLEAR_TARGET D3DCLEAR_ZBUFFER
[in] D3DCOLOR Color,--将表面颜色清到这个值
[in] float Z,--z buffer
[in] DWORD Stencil --stencil buffer
)可以清楚某个surface
3.3绘制的一般步骤
1设置buffer
2调用IDirect3DDevice9::DrawPrimitive从buffer绘制原语
不同的顶点元素可以输入到不同的流中,这样可以避免一种元素(如法向)改变不用重进送入其他元素
另外还有一种方法是直接从用户的缓存处而不是从显卡缓存绘制,调用IDirect3DDevice9::DrawPrimitiveUP
IDirect3DDevice9::DrawIndexedPrimitiveUP进行直接从CPU内存的绘制,这种绘制每次绘制要从内存取数据,但是有利有弊,它也可以省略了从显存取回数据的步骤,某些高频率更改顶点数据的操作用这种反而更快
3.4present a scene
1.程序不能直接锁住或者渲染到前缓存。前缓存是有后缓存交换过来的。通过IDirect3DDevice9::GetFrontBufferData可以获取截图
2.如果想从同一个设备中创建多个视口,那么就需要create多个swapchain
3.4.1 alpha blending
srcapha invsrcalpha