转换为 Direct3D 9
Microsoft Direct3D 9 中更改了以下功能。 如果使用这些功能,请参阅下面列出的更改,以帮助将应用程序移植到 Direct3D 9。
- BaseVertexIndex 更改
- CreateImageSurface 更改
- D3DENUM_NO_WHQL_LEVEL更改
- 创建资源更改
- EnumAdapterModes 更改
- 获取/SetStreamSource_Changes
- 多重采样质量更改
- ResourceManagerDiscardBytes 更改
- SetSoftwareVertexProcessing 更改
- 纹理采样器更改
- 顶点声明更改
- Intervals,_and_SwapEffects_Changes
BaseVertexIndex 更改
在 DirectX 8.x 中,IDirect3DDevice8::SetIndices 需要指向索引缓冲区的指针和一个 BaseVertexIndex 作为顶点缓冲区中的起始位置。 将不同对象批处理到顶点缓冲区的应用程序必须切换索引缓冲区 (或调用 IDirect3DDevice8::SetIndices) ,然后再调用 IDirect3DDevice8::D rawIndexedPrimitive。
在 Direct3D 9 中,顶点缓冲区 BaseVertexIndex 中的起始位置已移至 IDirect3DDevice9::D rawIndexedPrimitive,其数据类型从 DWORD 更改为 INT。
HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
D3DPRIMITIVETYPE PrimType,
INT BaseVertexIndex,
UINT minIndex,
UINT NumVertices,
UINT startIndex,
UINT primCount);
HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData);
CreateImageSurface 更改
IDirect3DDevice8::CreateImageSurface 已重命名为 CreateOffscreenPlainSurface。 添加了采用 D3DPOOL 类型的附加参数。 D3DPOOL_SCRATCH将返回与 IDirect3DDevice8::CreateImageSurface 创建的图面具有相同特征的图面。 D3DPOOL_DEFAULT是适合用于 StretchRect 和 ColorFill 的池。
D3DENUM_NO_WHQL_LEVEL更改
应用程序现在必须显式请求 Microsoft Windows 硬件质量实验室 (WHQL) ,因为响应需要花费相对较长的时间 (几秒钟) 。 已删除D3DENUM_NO_WHQL_LEVEL并添加了D3DENUM_WHQL_LEVEL。
创建资源更改
句柄已添加到多个方法中,应设置为 NULL。 受影响的方法包括:
- CreateTexture
- CreateVolumeTexture
- CreateCubeTexture
- CreateVertexBuffer
- CreateIndexBuffer
- CreateRenderTarget
- CreateDepthStencilSurface
- CreateOffscreenPlainSurface
EnumAdapterModes 更改
EnumAdapterModes 现在采用 D3DFORMAT。
HRESULT IDirect3D9::EnumAdapterModes(
UINT Adapter,
D3DFORMAT Format,
UINT Mode,
D3DDISPLAYMODE *pMode);
格式支持一组扩展的显示模式。 若要防止应用程序枚举应用程序交付时未发明的格式,应用程序必须告知 Direct3D 应枚举的显示模式的格式。 生成的显示模式数组仅在宽度、高度和刷新率方面有所不同。
应用程序指定像素格式,并且枚举仅限于与格式完全匹配的那些显示模式。 下面是允许的格式列表:
- D3DFMT_A1R5G5B5
- D3DFMT_A2B10G10R10
- D3DFMT_A8R8G8B8
- D3DFMT_R5G6B5
- D3DFMT_X1R5G5B5
- D3DFMT_X8R8G8B8
枚举等效于相同格式的 alpha 和非alpha 版本。 返回的格式将始终使用应用程序提供的相同格式填充。
此方法将 565 和 555 视为等效,并在 Format 中返回正确的版本。 仅当应用程序锁定后台缓冲区,并且应用程序必须设置显式标志才能实现此目的时,差异才会起作用。
Get/SetStreamSource 更改
已将一个参数添加到 GetStreamSource 和 SetStreamSource 方法。 偏移量是流开头和顶点数据开头之间的字节数。 它以字节为度量单位。 这使管道能够支持流偏移量。 若要了解设备是否支持流偏移量,请参阅D3DDEVCAPS2_STREAMOFFSET。
HRESULT GetStreamSource(
UINT StreamNumber,
IDirect3DVertexBuffer9 **ppStreamData,
UINT *pOffsetInBytes,
UINT *pStride);
多重采样质量更改
以前,只有D3DMULTISAMPLE_TYPE枚举。 Direct3D 9 保留此枚举,并为枚举的每个元素添加质量级别的理念。 质量级别指示视觉质量和性能之间的权衡,方法是指示D3DRS_MULTISAMPLEMASK) 意义上 (可屏蔽样本的数量。
应用程序应选择需要多少个可屏蔽示例,然后查阅 pQualityLevels。 如果不是零,则此值指示应用程序可以通过 MultiSampleQuality 传递给各种创建函数的质量级别数。 由于驱动程序在 D3DMULTISAMPLE_NONMASKABLE 时将其所有多重采样方案公开为质量级别,因此,如果应用程序不需要屏蔽示例,则可以通过此类型枚举所有可用的多重采样方案。
D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE caps 位已停用。 此位过去表示多重采样方法不支持写入掩码,并且无法在 BeginScene 和 EndScene 之间打开和关闭。 这些不可屏蔽的方法现在通过D3DMULTISAMPLE_NONMASKABLE公开。
HRESULT CheckDeviceMultiSampleType(
UINT Adapter,
D3DDEVTYPE DeviceType,
D3DFORMAT SurfaceFormat,
BOOL Windowed,
D3DMULTISAMPLE_TYPE MultiSampleType,
DWORD * pQualityLevels);
每个可屏蔽样本的最大值不同。 例如,D3DMULTISAMPLE_4_SAMPLES可能有三个质量级别,而D3DMULTISAMPLE_2_SAMPLES可能只有一个级别。 每个数量的可屏蔽样本最多有八个质量级别, (不允许驱动程序表达更多) 。 质量范围为 0 到 (*pQualityLevels - 1) 。
ResourceManagerDiscardBytes 更改
ResourceManagerDiscardBytes 已替换为 IDirect3DDevice9::EvictManagedResources。 它可以逐出所有资源,包括 Direct3D 和驱动程序资源。
现在,当资源 (托管还是非托管) 由于视频内存不足而无法创建时,将咨询资源管理器。 将自动要求经理释放足够的资源,以便成功创建。 在 DirectX 8.0 中,这不是一个自动化过程。
SetSoftwareVertexProcessing 更改
应用程序可以创建混合模式设备以使用软件和硬件顶点处理。
若要在 DirectX 8.x 中的两种顶点处理模式之间切换,请调用 IDirect3DDevice8::SetRenderState。 这已替换为 SetSoftwareVertexProcessing ,以缓解由状态块引起的问题。 状态块不会记录此新方法。
纹理采样器更改
Direct3D 9 使用像素着色器 2_0 模型一次支持多达 16 个纹理表面;但是,纹理坐标的数量仍然限制为 8。 纹理阶段状态与图面、坐标集、顶点处理和像素处理相关联。 为了在编译时管理这些差异, SetTextureStageState 已分为两种方法:
- IDirect3DDevice9::SetTextureStageState 仍将用于纹理坐标状态,例如环绕模式和纹理坐标生成。
- SetSamplerState 已添加,现在将用于筛选、平铺、固定、MIPLOD 等。 这最多适用于 16 个采样器。
SetTextureStageState 更改
IDirect3DDevice9::SetTextureStageState 现在设置以下状态:
修复了函数顶点处理状态。 此状态控制纹理坐标D3DTSS_TEXTURETRANSFORMFLAGS和D3DTSS_TEXCOORDINDEX操作。 (最多可以设置八个纹理坐标,因为) 始终支持八个纹理坐标。 D3DTSS_TEXCOORDINDEX是固定函数顶点处理状态。 如果使用可编程顶点着色器,则忽略此状态。
修复了旧版 TextureStageState) (函数像素着色器状态。
- D3DTSS_ALPHAARG0
- D3DTSS_ALPHAARG1
- D3DTSS_ALPHAARG2
- D3DTSS_ALPHAOP
- D3DTSS_BUMPENVLOFFSET
- D3DTSS_BUMPENVLSCALE
- D3DTSS_BUMPENVMAT00
- D3DTSS_BUMPENVMAT01
- D3DTSS_BUMPENVMAT10
- D3DTSS_BUMPENVMAT11
- D3DTSS_COLORARG0
- D3DTSS_COLORARG1
- D3DTSS_COLORARG2
- D3DTSS_COLOROP
- D3DTSS_RESULTARG
可设置的固定函数像素着色器状态数小于或等于 MaxTextureBlendStages 表示的数字。
应用程序可用的纹理采样器数由像素着色器版本决定,如下表所示。
名称 | 数字 |
---|---|
ps_1_1 ps_1_3 | 4 个纹理采样器 |
ps_1_4 | 6 个纹理采样器 |
ps_2_0 | 16 个纹理采样器 |
固定函数管道 | MaxTextureBlendStages/MaxSimultaneousTextures 纹理采样器 |
在 Direct3D 9 中支持位移映射的设备将支持其他采样器 (D3DDMAPSAMPLER) ,该采样器在细化器单元中采样位移映射。
SetSamplerState 更改
IDirect3DDevice9::SetSamplerState 设置采样器状态 (包括细化器单元中使用的采样器状态,以) 采样位移贴图。 它们已重命名为D3DSAMP_前缀,以便在从 DirectX 8.x 移植时启用编译时错误检测。 状态包括:
- D3DSAMP_ADDRESSU
- D3DSAMP_ADDRESSV
- D3DSAMP_ADDRESSW
- D3DSAMP_BORDERCOLOR
- D3DSAMP_MAGFILTER
- D3DSAMP_MAXANISOTROPY
- D3DSAMP_MAXMIPLEVEL
- D3DSAMP_MINFILTER
- D3DSAMP_MIPFILTER
- D3DSAMP_MIPMAPLODBIAS
顶点声明更改
现在,顶点声明与顶点着色器创建分离。 顶点声明现在使用组件对象模型 (COM) 接口。
对于 DirectX 8.x,顶点声明与顶点着色器相关联。
- 对于固定函数管道,请使用灵活顶点格式 (FVF) 顶点缓冲区的代码调用 SetVertexShader 。
- 对于顶点着色器,请使用以前创建的顶点着色器的句柄调用 IDirect3DDevice9::SetVertexShader。 着色器包含顶点声明。
对于 Direct3D 9,顶点声明与顶点着色器分离,并且可以与固定函数管道或着色器一起使用。
- 对于固定函数管道,无需调用 IDirect3DDevice9::SetVertexShader。 但是,如果要切换到固定函数管道,并且之前使用了顶点着色器,请调用 IDirect3DDevice9::SetVertexShader (NULL) 。 完成此操作后,仍需要调用 SetFVF 来声明 FVF 代码。
- 使用顶点着色器时,使用顶点着色器对象调用 IDirect3DDevice9::SetVertexShader。 此外,调用 IDirect3DDevice9::SetFVF 设置顶点声明。 这会使用 FVF 中隐式的信息。 SetVertexDeclaration 可以代替 IDirect3DDevice9::SetFVF 调用,因为它支持不能用 FVF 表示的顶点声明。
间隔和 SwapEffects 更改
进行了多项更改,使用户能够更好地控制监视器刷新率、呈现速率以及前缓冲区与后台缓冲区绘图。 这些限制如下:
- D3DPRESENT_RATE_UNLIMITED删除了一个交换效果、D3DSWAPEFFECT_COPY_VSYNC和一个演示速率。
- 重命名D3DPRESENT_PARAMETERS。FullScreen_PresentationInterval PresentationIntervals。
- 添加了 D3DPRESENT_INTERVAL_IMMEDIATE,这意味着演示文稿与垂直同步不同步。与 DirectX 8.x 中一样,D3DPRESENT_INTERVAL_DEFAULT定义为零,等效于 D3DPRESENT_INTERVAL_ONE。 D3DPRESENT_INTERVAL_DEFAULT便于将D3DPRESENT_PARAMETERS初始化为零。
有关支持的模式和间隔的详细说明,请参阅 D3DPRESENT。
相关主题