D3D创建基本图元函数解析

本文深入解析Direct3D9 API中的关键概念,包括顶点缓存创建、状态设置、渲染流程等核心部分,详细阐述了如何高效地管理顶点数据,设置设备转换状态,并通过实例演示了渲染过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.CreateVertexBuffer创建一个顶点缓存
Device->CreateVertexBuffer(
        3 * sizeof(Vertex), // size in bytes
        D3DUSAGE_WRITEONLY, // flags
        Vertex::FVF,        // vertex format
        D3DPOOL_MANAGED,    // managed memory pool
        &Triangle,          // return create vertex buffer
        0);                 // not used - set to 0

HRESULT CreateVertexBuffer(
  [in]           UINT Length,// 至少大于一个顶点的字节数,非FVF Buffer用长度是不合理的。
  [in]           DWORD Usage,// 必须和CreateDevice的behavior flag匹配,比如软件顶点运算的不能放置到VM中
//FVF表明内存布局。非FVF的顶点数据可以用作单次扫描中使用多通道渲染或者多重纹理渲染,
// 一个顶点缓存记录几何s信息,一个顶点缓存记录纹理坐标信息,渲染期间单次扫描从两个缓存交错的取得数据,
// 这种情况下,如果FVF格式再使用(应该是这两个缓存),那么速度和内存都会受到一些损失,损失依赖于使用的策略。
  [in]           DWORD FVF,
  [in]           D3DPOOL Pool,
  [out, retval]  IDirect3DVertexBuffer9 **ppVertexBuffer,
  [in]           HANDLE *pSharedHandle // 保留,这个标记在windows vista中的Direct3D9中用于共享资源。
);

2.SetTransform设置一个设备对象空间转换相关的状态(传入一个状态和矩阵,但是转换是在固定管线中执行的)。
Device->SetTransform(D3DTS_PROJECTION, &proj);
HRESULT SetTransform(
  [in]  D3DTRANSFORMSTATETYPE State,
  [in]  const D3DMATRIX *pMatrix
);

3.SetRenderState设置渲染状态,和状态对应的枚举类型(渲染状态去掉RS_)的值
Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
HRESULT SetRenderState(
  [in]  D3DRENDERSTATETYPE State,
  [in]  DWORD Value
);

4.BeginScene()开始在后台缓存区渲染图形,场景渲染开始的标记
任何连续的内存在渲染执行之前需要Present提交到runtime的,都需要BegineScene/EndScene对括起来
(IDirect3DSwapChain9::Present也一样).BegineScene/EndScene对只能并行使用,不能串行使用。
多个BegineScene/EndScene对并行是会对性能有损失的,尽量少用。

5.EndScene()结束在后台缓存区渲染图形 ,这个函数返回,那么资源已经由runtime/driver管理进行排队渲染了,这个函数是非同步的,因此这个函数返回不能保证已经渲染
完了。

6.SetStreamSource绑定一个顶点缓存到一个设备数据流。
Device->SetStreamSource(0, Triangle, 0, sizeof(Vertex));
HRESULT SetStreamSource(
  [in]  UINT StreamNumber,//指定一个数据流,从[0, streamNum-1].
  [in]  IDirect3DVertexBuffer9 *pStreamData, // 绑定到设备数据流的顶点缓存指针
  [in]  UINT OffsetInBytes,// 输入的顶点缓存的偏移,从0开始是输入整个缓存
  [in]  UINT Stride// 组件的字节跨度,一般是顶点的字节数(特别是FVF vertex shader中),declaration的时候
                  // 必须大于或者等于stream size. 如果顶点缓存被渲染多次的时跨度要用0表示,告诉runtime不要增长顶点缓存偏移。
);

7.SetFVF设置当前的顶点流声明
Device->SetFVF(Vertex::FVF);
IDirect3DDevice9::SetFVF to use the fixed function pipeline指明用固定功能渲染管道。
IDirect3DDevice9::SetVertexDeclaration可以指明用顶点着色器。

8.DrawPrimitive渲染一个没有索引编制的序列,在数据输入流SetStreamSource中指定的类型的基础几何数据。
Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
HRESULT DrawPrimitive(
  [in]  D3DPRIMITIVETYPE PrimitiveType, // 基础图元的类型D3DPRIMITIVETYPE
  [in]  UINT StartVertex, // 渲染开始的顶点下标
  [in]  UINT PrimitiveCount // 指定图元类型的个数(和图元类型相关),最大个数需要检测D3DCAPS0支持.
);

9.IDirect3DVertexBuffer9 Lock锁定顶点缓存区域和获取顶点缓存的内存指针

IDirect3DVertexBuffer9* Triangle = CreateVertexBuffer(xxx);
Triangle->Lock(0, 0, (void**)&vertices, 0);

HRESULT Lock(
  [in]   UINT OffsetToLock, // 锁定的起始位置,0是最开始位置
  [in]   UINT SizeToLock, // 锁定的大小,0是全部
  [out]  VOID **ppbData, // 顶点缓存内存指针
  [in]   DWORD Flags // D3DLOCK 0/1个或者多个组合
);

UnLock()
Unlocks vertex data.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值