转换为 Direct3D 9

Microsoft Direct3D 9 中更改了以下功能。 如果使用这些功能,请参阅下面列出的更改,以帮助将应用程序移植到 Direct3D 9。

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是适合用于 StretchRectColorFill 的池。

D3DENUM_NO_WHQL_LEVEL更改

应用程序现在必须显式请求 Microsoft Windows 硬件质量实验室 (WHQL) ,因为响应需要花费相对较长的时间 (几秒钟) 。 已删除D3DENUM_NO_WHQL_LEVEL并添加了D3DENUM_WHQL_LEVEL。

创建资源更改

句柄已添加到多个方法中,应设置为 NULL。 受影响的方法包括:

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 更改

已将一个参数添加到 GetStreamSourceSetStreamSource 方法。 偏移量是流开头和顶点数据开头之间的字节数。 它以字节为度量单位。 这使管道能够支持流偏移量。 若要了解设备是否支持流偏移量,请参阅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 位已停用。 此位过去表示多重采样方法不支持写入掩码,并且无法在 BeginSceneEndScene 之间打开和关闭。 这些不可屏蔽的方法现在通过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。

Direct3D 9 图形