生成 MIP 贴图纹理的子级别

显示驱动程序指示支持通过设置 DDCORECAPS 结构的 dwCaps2 成员的 DDCAPS2_CANAUTOGENMIPMAP 位来自动生成 MIP 贴图纹理的子级别。 驱动程序在DD_HALINFO结构的 ddCaps 成员中指定此 DDCORECAPS 结构。 DD_HALINFO由驱动程序的 DrvGetDirectDrawInfo 函数返回。 显示驱动程序还通过设置格式的 DDPIXELFORMAT 结构的 dwOperations 成员中的 D3DFORMAT_OP_AUTOGENMIPMAP 标志来指示特定图面格式是否支持自动生成子级别。

创建纹理图面时,Direct3D 运行时设置 DDSCAPSEX (DDSCAPS2) 结构的 dwCaps3 成员的DDSCAPS3_AUTOGENMIPMAP位,以指示可以自动生成此纹理的 MIP 映射子级别。 如果 Direct3D 指示某些纹理自动生成其 MIP 映射子级别,而某些纹理不自动生成,则驱动程序只能对这些纹理执行 blit 操作 (D3DDP2OP_TEXBLT) ,如以下方案所述:

  • 驱动程序无法从自动生成 MIP 的源纹理转换为不映射的目标纹理。

  • 如果驱动程序从不自动生成 MIP 的源纹理转换为目标纹理,则驱动程序只会将最顶层的匹配级别闪烁。 将忽略源纹理中的子级别。 可以生成目标子级别。

  • 同样,如果驱动程序从源纹理到目标纹理的两个自动生成 MIP 映射,则驱动程序只会点燃最顶层的匹配级别。 将忽略源纹理中的子级别。 可以生成目标子级别。

若要生成 MIP 贴图纹理的子级别,驱动程序将接收D3DDP2OP_GENERATEMIPSUBLEVELS命令以及 D3DHAL_DP2GENERATEMIPSUBLEVELS 结构。 若要接收此命令,纹理的图面格式必须公开D3DFORMAT_OP_AUTOGENMIPMAP标志。

对于 驱动程序管理的资源,当驱动程序逐出并替换视频内存中的资源时,驱动程序必须使用最后一个设置的筛选器类型来自动生成子级别。 由于 Direct3D 不控制资源的逐出和替换,因此 Direct3D 不会向驱动程序发送D3DDP2OP_GENERATEMIPSUBLEVELS命令。

Direct3D 运行时无法调用驱动程序的 DdLock 函数或使用任何其他 DDI 访问自动生成的 MIP 贴图纹理的子级别。 这意味着自动生成的 MIP 贴图纹理(如轻型 MIP 贴图纹理)的子级别是“隐式的”,可由驱动程序根据需要指定。 驱动程序不需要指定“完整”图面数据结构。 但请注意,Direct3D 必须能够调用驱动程序的 DdLockDdBlt 函数、发送D3DDP2OP_BLT命令,或者对 驱动程序管理的纹理、动态纹理或供应商特定的格式使用任何其他 DDI (,仅) 才能访问自动生成的 MIP 贴图纹理的顶层。