DirectX9 渲染设置
固定管线中:
1.为设备创建一个顶点和索引缓存
HRESULT IDirect3DDevice9::CreateVertexBuffer(
UINT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool
IDirect3DVertexBuffer9** ppVertexBuffer,
HANDLE* pSharedHandle
);
ppVertexBuffer:缓存
FVF:缓存的定点格式
2.读写缓存:
HRESULT IDirect3DVertexBuffer9::Lock(
UINT OffsetToLock,
UINT SizeToLock,
BYTE** ppbData,
DWORD Flags
);
步骤:
锁缓存
读写缓存
解锁缓存
3.设置资源流(指定某某缓存为流入该设备渲染的缓存)
HRESULT IDirect3DDevice9::SetStreamSource(
UINT StreamNumber,
IDirect3DVertexBuffer9* pStreamData,//渲染这个缓存
UINT OffsetInBytes,
UINT Stride
);
4.设置顶点格式(在这里我们指定后面用来绘图调用的顶点的顶点格式。)
_device->SetFVF( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1 );
它也是后面顶点声明用的格式。告诉GPU,顶点结构中每个数据是什么意思,以后传进shader也用这个意思来传
5.设置索引缓存
_device->SetIndices( _ib ); // 传递一个索引缓存指针的拷贝
6.用指定的这些缓存绘制
IDirect3DDevice9::DrawPrimitive
这个方法不使用索引信息绘制图元。
IDirect3DDevice9::DrawIndexedPrimitive
这个方法使用索引信息来绘制图元。
GPU会用设置好的它的资源绘制出指定的东西来
可编程管线:
1.顶点着色器(vertex shader)
是一个在图形卡的GPU 上执行的程序,
它替换了固定功能管线(fixed function pipeline)中的变换(transformation)和光照(lighting)阶段。
2.顶点声明:同fvf
3.描述顶点声明 :D3DVERTEXELEMENT9
typedef struct _D3DVERTEXELEMENT9 {
BYTE Stream;
BYTE Offset; // Offset——偏移,按字节,相对于顶点结构成员的顶点分量的开始
BYTE Type;
BYTE Method;
BYTE Usage;
BYTE UsageIndex;
} D3DVERTEXELEMENT9;
为 D3DVERTEXELEMENT9 数组
4.创建顶点声明:IDirect3DVertexDeclaration9
HRESULT IDirect3DDevice9::CreateVertexDeclaration(
CONST D3DVERTEXELEMENT9* pVertexElements,
IDirect3DVertexDeclaration9** ppDecl
);
IDirect3DVertexDeclaration9 返回的顶点声明
5.设置顶点声明
Device->SetVertexDeclaration( _decl );
6.语义:
作用是,用来定义一个顶点声明的元素到顶点着色器的Input 结构的数据成员的映射
7.编译着色器:D3DXBuffer
D3DXCompileShaderFromFile
返回返回一个 D3DXBuffer 指针表示着色器代码二进制
8.创建顶点着色器: IDirect3DVertexShader9
HRESULT IDirect3DDevice9::CreateVertexShader(
const DWORD *pFunction,
IDirect3DVertexShader9** ppShader
);
pFunction ——已编译着色器代码的指针
ppShader ——返回一个IDirect3DVertexShader9 接口的指针
9.设置顶点着色器:
为该设备渲染时用的顶点着色器
HRESULT IDirect3DDevice9::SetVertexShader(
IDirect3DVertexShader9* pShader
);
10.销毁顶点着色器