DX9设备的一些方法介绍(IDirect3DDevice9)
1,IDirect3DDevice9::SetRenderState:设置单个设备渲染状态参数。
C++源码调用如下:
HRESULT SetRenderState(
[in] D3DRENDERSTATETYPE State,
[in] DWORD Value
);
参数说明:
**State:**正在修改的设备状态变量。此参数可以是D3DRENDERSTATETYPE枚举类型的任何成员。
D3DRENDERSTATETYPE:渲染状态定义各种顶点和像素处理的设置状态。有些渲染状态设置顶点处理,有些设置像素处理(请参见渲染状态(Direct3D 9))。可以使用状态块保存和还原渲染状态(请参见状态块保存并还原状态(Direct3D 9))。
Value: 要设置的设备呈现状态的新值。此参数的含义取决于为State指定的值。例如,如果State是D3DRS_SHADEMODE,则第二个参数将是D3DSHADEMODE枚举类型的一个成员。
在VB6中调用如下:
Set CWD3DDevice9 = CWD3D9.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, CWHwnd, JSorH, CWDpp9)
CWD3DDevice9.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
' Alpha 混合的效果比 Alpha 测试好,但 Alpha 测试是直接剔除不透明像素,不需要做混合运算,可以提高性能。
' Alpha 混合(实现透明度功能,可以全透明、不透明、半透明)
CWD3DDevice9.SetRenderState D3DRS_ALPHABLENDENABLE, True
CWD3DDevice9.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
CWD3DDevice9.SetRenderState D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA
' Alpha 测试(只能实现全透明和不透明,不能半透明,但是效率比 Alpha 混合高)
CWD3DDevice9.SetRenderState D3DRS_ALPHATESTENABLE, True
CWD3DDevice9.SetRenderState D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL
CWD3DDevice9.SetRenderState D3DRS_ALPHAREF, 1
2,IDirect3DDevice9::SetSamplerState:设置采样器状态值。
C++源码调用如下:
HRESULT SetSamplerState(
[in] DWORD Sampler,
[in] D3DSAMPLERSTATETYPE Type,
[in] DWORD Value
);
参数如下:
Sampler:采样器阶段索引。有关采样器阶段的详细信息,请参阅vs_3_0(DirectX HLSL)中的采样阶段寄存器。
Type:此参数可以是D3DSAMPLERSTATETYPE枚举类型的任何成员(采样器状态定义纹理采样操作,例如纹理寻址和纹理过滤。一些采样器状态设置顶点处理,一些设置像素处理。可以使用状态块保存和恢复采样器状态)。
Value:要设置的状态值。此值的含义由Type参数确定。
在VB6中调用如下:
CWD3DDevice9.SetSamplerState 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR
CWD3DDevice9.SetSamplerState 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR
CWD3DDevice9.SetSamplerState 0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER
CWD3DDevice9.SetSamplerState 0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER
3,IDirect3DDevice9::SetTexture :为设备的舞台指定纹理。
C++调用源码:
HRESULT SetTexture(
[in] DWORD Stage,
[in] IDirect3DBaseTexture9 *pTexture
);
参数说明:
Stage:基于零的采样器编号。纹理与采样器绑定;采样器定义采样状态,例如过滤模式和地址包装模式。可编程和固定功能管道对纹理的引用不同:可编程着色器使用采样器编号引用纹理。可编程着色器可用的采样器数量取决于着色器版本。有关顶点着色器,请参见采样器(Direct3D 9 asm vs)。有关像素着色器,请参见采样器(Direct3D 9 asm ps)。另一方面,固定函数管道通过纹理阶段编号引用纹理。取样器的最大数量由两个上限决定:D3DCAPS9结构的MaxSynchronialTextures和MaxTextureBlendStages。
阶段/采样器编号还有两种特殊情况。
一个名为D3DDMAPSAMPLER的特殊编号用于置换映射(Direct3D 9)。
当访问vs_3_0(DirectX HLSL)中的顶点纹理时,可编程顶点着色器使用由D3DVERTEXTURESAMPLER定义的特殊数字。
pTexture:指向IDirect3DBaseTexture9接口的指针,表示正在设置的纹理。
在VB6中的调用如下:
CWD3DDevice9.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
4,IDirect3DDevice9::Clear:清除一个或多个曲面,例如渲染目标、多个渲染目标、模具缓冲区和深度缓冲区。
C++调用源码:
HRESULT Clear(
[in] DWORD Count,
[in] const D3DRECT *pRects,
[in] DWORD Flags,
[in] D3DCOLOR Color,
[in] float Z,
[in] DWORD Stencil
);
参数说明:
Count:pRects处数组中的矩形数。如果pRects为NULL,则必须设置为0。如果pRects是有效指针,则不能为0。
pRects:指向描述要清除的矩形的D3DRECT(定义矩形)结构数组的指针。将矩形设置为渲染目标的尺寸,以清除整个曲面。每个矩形都使用与渲染目标上的点对应的屏幕坐标。坐标被剪裁到视口矩形的边界。要指示要清除整个视口矩形,请将此参数设置为NULL,并将“计数”设置为0。
Flags:一个或多个D3DCLEAR标志的组合,指定要清除的曲面。
Color:将渲染目标清除为此ARGB颜色。
Z:将深度缓冲区清除为这个新的z值,范围从0到1。请参阅备注。
Stencil:将模具缓冲区清除为此范围为0到2的新值ⁿ-1(n是模具缓冲区的位深度)。见备注。
在VB6中调用:
CWD3DDevice9.Clear 0, ByVal 0, D3DCLEAR_TARGET, BackColor, 0!, 0 '清除深度缓冲区
5,IDirect3DDevice9::BeginScene:开始场景。一般开始前要先使用IDirect3DDevice9::Clear清除缓冲区。
C++调用:
HRESULT BeginScene();
在VB6中调用如下:
CWD3DDevice9.BeginScene
6,IDirect3DDevice9::EndScene:结束通过调用IDirect3DDevice9::BeginScene开始的场景。
C++调用源码:
HRESULT EndScene();
在VB6调用:
CWD3DDevice9.EndScene '场景结束
7,IDirect3DDevice9::Present:按设备拥有的后台缓冲区的顺序显示下一个缓冲区的内容。
C++调用源码:
HRESULT Present(
[in] const RECT *pSourceRect,
[in] const RECT *pDestRect,
[in] HWND hDestWindowOverride,
[in] const RGNDATA *pDirtyRegion
);
参数说明:
pSourceRect:指向必须为NULL的值的指针,除非交换链是用D3DSWAPEFFECT_COPY创建的。pSourceRect是指向包含源矩形的RECT(RECT结构通过其左上角和右下角的坐标定义矩形。)结构的指针。如果为NULL,则显示整个源曲面。如果矩形超出源曲面,则矩形将剪裁到源曲面。
pDestRect:指向必须为NULL的值的指针,除非交换链是用D3DSWAPEFFECT_COPY创建的。pDestRect是指向包含目标矩形的RECT结构的指针,以窗口客户端坐标表示。如果为NULL,则填充整个客户端区域。如果矩形超出目标客户端区域,则矩形将被剪裁到目标客户端区域。
hDestWindowOverride:指向目标窗口的指针,其工作区被视为此演示文稿的目标。如果该值为NULL,则运行库将使用D3DPRESENT_PARAMETERS的hDeviceWindow成员来表示。
pDirtyRegion:除非使用D3DSWAPEFFECT_COPY创建交换链,否则值必须为NULL。有关交换链的详细信息,请参见翻转曲面(Direct3D 9)和D3DSWAPEFFECT。如果该值为非NULL,则包含的区域用后缓冲区坐标表示。区域内的矩形是需要更新的最小像素集。此方法通过仅复制区域内的像素或一些适当扩展的矩形集来优化表示时,将这些矩形考虑在内。这只是对优化的一种帮助,应用程序不应该依赖于精确复制的区域。实现可以选择复制整个源矩形。
在VB6中调用如下:
CWD3DDevice9.Present ByVal 0, ByVal 0, 0, ByVal 0 '刷新
8,IDirect3DDevice9::GetBackBuffer:从设备的交换链检索后台缓冲区。
C++调用代码:
HRESULT GetBackBuffer(
[in] UINT iSwapChain,
[in] UINT iBackBuffer,
[in] D3DBACKBUFFER_TYPE Type,
[out, retval] IDirect3DSurface9 **ppBackBuffer
);
参数说明:
iSwapChain:指定交换链的无符号整数。
iBackBuffer:要返回的后台缓冲区对象的索引。后台缓冲区的编号从0到后台缓冲区总数减1。值为0时返回第一个后缓冲区,而不是前缓冲区。无法通过此方法访问前缓冲区。使用IDirect3DDevice9::GetFrontBufferData(生成设备前缓冲区的副本,并将其放在应用程序提供的系统内存缓冲区中。)检索前缓冲区的副本。
Type:Direct3D 9不支持立体视图,因此此参数的唯一有效值是D3DBACKBUFFER_TYPE_MONO。
ppBackBuffer:指向IDirect3DSurface9接口的指针的地址,表示返回的后台缓冲区表面。
在VB6中调用如下:
Set BackBuffer = CWD3DDevice9.GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO)
9,IDirect3DDevice9::TestCooperativeLevel:报告窗口或全屏应用程序的Direct3D设备的当前协作级别状态。如果方法成功,返回值为D3D_OK,表示设备可以运行,调用应用程序可以继续。如果方法失败,返回值可以是以下值之一:D3DERR_DEVICELOST、D3DERR_DEVICENOTRESET、D3TERR_DRIVERINTERNALERROR。
c++调用:
HRESULT TestCooperativeLevel();
在VB6中调用:
If CWD3DDevice9.TestCooperativeLevel = D3DERR_DEVICENOTRESET Then '检测到设备丢失
10,IDirect3DDevice9::Reset:重置交换链的类型、大小和格式。
C++调用:
HRESULT Reset(
[in, out] D3DPRESENT_PARAMETERS *pPresentationParameters
);
在VB6中调用:
CWD3DDevice9.Reset CWDpp9