D3D9学习笔记(四) 绘制

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::DrawPrimitivebuffer绘制原语

不同的顶点元素可以输入到不同的流中,这样可以避免一种元素(如法向)改变不用重进送入其他元素

 

另外还有一种方法是直接从用户的缓存处而不是从显卡缓存绘制,调用IDirect3DDevice9::DrawPrimitiveUP

IDirect3DDevice9::DrawIndexedPrimitiveUP进行直接从CPU内存的绘制,这种绘制每次绘制要从内存取数据,但是有利有弊,它也可以省略了从显存取回数据的步骤,某些高频率更改顶点数据的操作用这种反而更快

 

3.4present a scene

1.程序不能直接锁住或者渲染到前缓存。前缓存是有后缓存交换过来的。通过IDirect3DDevice9::GetFrontBufferData可以获取截图

 

2.如果想从同一个设备中创建多个视口,那么就需要create多个swapchain

 

3.4.1 alpha blending

srcapha invsrcalpha

posted on 2012-11-22 15:34  leonwei  阅读(414)  评论(0)    收藏  举报