Direct3D 9) (纹理脏区域
应用程序可以通过在纹理上指定“脏”区域来优化复制纹理的子集。 只有标记为 脏 的区域才会通过调用 IDirect3DDevice9::UpdateTexture 进行复制。 但是,可以扩展脏区域以优化对齐方式。 创建纹理时,会将整个纹理视为脏。 只有以下操作会影响纹理的脏状态:
- 将脏区域添加到纹理。
- 锁定纹理中的一些缓冲区。 此操作会将锁定的区域添加为脏区域。 如果应用程序更了解实际脏区域,则它可以关闭此自动脏区域更新。
- 在 IDirect3DDevice9::UpdateSurface 中使用纹理的图面级别作为目标,将整个纹理标记为脏。
- 使用纹理作为 IDirect3DDevice9::UpdateTexture 中的源会清除源纹理上的所有脏区域。
- 使用 IDirect3DSurface9::GetDC 返回设备上下文。
- 调用 IDirect3DBaseTexture9::GenerateMipSubLevels 会将整个纹理标记为脏。
- 调用 IDirect3DBaseTexture9::SetAutoGenFilterType 会将整个纹理标记为脏。
脏区域在 mipmapped 纹理的顶层设置,IDirect3DDevice9::UpdateTexture 可以在 mip 链中向下扩展脏区域,以最大程度地减少为每个子级别复制的字节数。 请注意,子级别脏区域坐标向外舍入,也就是说,它们的小数部分向纹理的最靠近边缘舍入。
由于每种类型的纹理具有不同类型的脏区域,因此每种纹理类型都有方法。 2D 纹理使用脏矩形,而体积纹理使用框。
- IDirect3DCubeTexture9::AddDirtyRect
- IDirect3DTexture9::AddDirtyRect
- IDirect3DVolumeTexture9::AddDirtyBox
为上述方法的 pDirtyRect 或 pDirtyBox 参数传递 NULL 会扩展脏区域以覆盖整个纹理。
每个锁定方法都可以采用D3DLOCK_NO_DIRTY_UPDATE,从而防止对纹理脏状态进行任何更改。 有关详细信息,请参阅 将资源锁定 (Direct3D 9) 。
如果提供了有关在锁定操作期间更改的真实区域集的详细信息,应用程序应使用 D3DLOCK_NO_DIRTY_UPDATE。 请注意,锁或复制到纹理子级别仅 (,即,不锁定或复制到顶级) 不会更新该纹理的脏区域。 当应用程序锁定较低级别而不锁定最顶层时,应用程序在更新脏区域时承担相同的责任。
相关主题