D3DHAL_DP2TEXBLT 结构 (d3dhal.h)

D3dDrawPrimitives2 响应D3DDP2OP_TEXBLT命令标记时,D3DHAL_DP2TEXBLT结构用于纹理 blts。

语法

typedef struct _D3DHAL_DP2TEXBLT {
  DWORD dwDDDestSurface;
  DWORD dwDDSrcSurface;
  POINT pDest;
  RECTL rSrc;
  DWORD dwFlags;
} D3DHAL_DP2TEXBLT;

成员

dwDDDestSurface

指定目标纹理的句柄。

dwDDSrcSurface

指定源纹理的句柄。

pDest

指定应在其中执行 blt 的目标点,即目标图面 (dwDDDestSurface) 开始 blt 的点。 POINT 结构的 这些 xy 成员在屏幕坐标中指定。

rSrc

指定要在源纹理中 blitted 的矩形,即源图面中的源矩形 (dwDDSrcSurface) blt。

dwFlags

预留给系统使用。

注解

D3dCreateSurfaceEx 回调为可用作纹理 bt 的源纹理和目标纹理创建小整数句柄。

D3DHAL_DP2TEXBLT 结构与D3DDP2OP_TEXBLT命令流标记一起使用,以通知驱动程序执行从源纹理到目标纹理的 blt 操作。 纹理也可以是立方体环境贴图。 驱动程序应将源纹理中 rSrc 指定的矩形复制到目标纹理中的 pDest 指定的位置。 目标和源纹理由在纹理创建期间通知驱动程序的句柄标识。 如果驱动程序能够管理纹理,则目标句柄可能是 0。 这向驱动程序指示,它应将纹理预加载到视频内存 (或硬件从) 高效纹理的任何位置。 在这种情况下,驱动程序可以忽略 rSrcpDest

请注意,对于 MIP 映射纹理,只有一个D3DDP2OP_TEXBLT指令插入 到 D3dDrawPrimitives2 命令流中。 在这种情况下,驱动程序应会 blt 纹理中存在的所有 MIP 贴图级别。 可以通过在每个级别将 rSrcpDest 除以 2 来获取在 MIP 地图子级别中复制的区域。

源纹理和目标纹理可能包含不同数量的 MIP 贴图级别。 在这种情况下,驱动程序应会保护通用级别。 例如,如果 256x256 源纹理具有 8 个 MIP 贴图级别,并且目标为具有 6 个级别的 64x64 纹理,则驱动程序应从源中筛选 6 个相应的级别。 驱动程序可以预期目标纹理的顶级 MIP 级别的尺寸始终小于或等于源纹理的最高 MIP 级别的尺寸。

请注意,源和目标句柄始终引用顶级图面,而绝不引用任何 MIP 映射子级别。 由于应用程序中出现错误,目标纹理可能包含额外的 MIP 贴图级别。 例如,源 256x256 纹理可以包含五个级别,但目标 256x256 纹理可以包含八个级别。 驱动程序应安全地处理这种情况,但不应生成正确的结果。 由于旧版应用程序兼容性问题,Direct3D 不会阻止将此类源/目标纹理对传递给驱动程序。

驱动程序可以预期源纹理和目标纹理的像素格式相同,并且通常可以安全地执行指定的 blt。 除了上述单一情况外,驱动程序不应出现任何导致无法执行 blt 的情况。

如果驱动程序想要执行从系统内存到视频内存的异步 blts,则应实现 DirectDraw HAL 调用 GetSysmemBltStatus,否则可能会出现不一致的情况。

使用 TexBlt 时,驱动程序无需执行任何同步,因为 TexBlts 与呈现命令始终按正确的顺序发出。 在此之前,驱动程序必须正确处理 DirectDraw blt 修改由任何 Direct3D 上下文中的呈现命令引用的任何纹理的情况。 当存在多个上下文时,Direct3D 不会发出 TexBlts。 这意味着驱动程序编写器可以省略 TexBlt 代码路径中的同步代码 (但仍需要同步 blts) 。

示例

以下伪代码显示了如何针对连续 MIP 级别计算子对象,以便从 MIP 级别 i 转到 MIP 级别 i + 1:

rect.left >>= 1; 
rect.top >>= 1; 
DWORD right = (rect.right + 1) >> 1; 
DWORD bottom = (rect.bottom + 1) >> 1; 
rect.right = ((right - rect.left) < 1) ? 
    (rect.left + 1) : (right); 
rect.bottom = ((bottom - rect.top ) < 1) ? 
    (rect.top + 1) : (bottom);

要求

要求
Header d3dhal.h (包括 D3dhal.h)

另请参阅

D3DDP2OP_TEXBLT

D3dCreateSurfaceEx

D3dDrawPrimitives2