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 结构的 这些 x 和 y 成员在屏幕坐标中指定。
rSrc
指定要在源纹理中 blitted 的矩形,即源图面中的源矩形 (dwDDSrcSurface) blt。
dwFlags
预留给系统使用。
注解
D3dCreateSurfaceEx 回调为可用作纹理 bt 的源纹理和目标纹理创建小整数句柄。
D3DHAL_DP2TEXBLT 结构与D3DDP2OP_TEXBLT命令流标记一起使用,以通知驱动程序执行从源纹理到目标纹理的 blt 操作。 纹理也可以是立方体环境贴图。 驱动程序应将源纹理中 rSrc 指定的矩形复制到目标纹理中的 pDest 指定的位置。 目标和源纹理由在纹理创建期间通知驱动程序的句柄标识。 如果驱动程序能够管理纹理,则目标句柄可能是 0。 这向驱动程序指示,它应将纹理预加载到视频内存 (或硬件从) 高效纹理的任何位置。 在这种情况下,驱动程序可以忽略 rSrc 和 pDest。
请注意,对于 MIP 映射纹理,只有一个D3DDP2OP_TEXBLT指令插入 到 D3dDrawPrimitives2 命令流中。 在这种情况下,驱动程序应会 blt 纹理中存在的所有 MIP 贴图级别。 可以通过在每个级别将 rSrc 和pDest 除以 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