Direct3D 9 (紋理變更區域)
應用程式可以藉由在紋理上指定「已變更」區域,將紋理的子集優化。 只有標示為已變更的區域會透過 呼叫 IDirect3DDevice9::UpdateTexture來複製。 不過,可能會擴充已變更的區域,以優化對齊方式。 建立紋理時,會將整個紋理視為已變更。 只有下列作業會影響紋理的已變更狀態:
- 將已變更的區域新增至紋理。
- 鎖定紋理中的一些緩衝區。 這項作業會將鎖定的區域新增為已變更的區域。 如果應用程式對於實際的已變更區域有更好的瞭解,應用程式可以關閉這個自動變更區域更新。
- 使用紋理表面層級做為 IDirect3DDevice9::UpdateSurface 中的目的地,會將整個紋理標示為已變更。
- 使用紋理作為 IDirect3DDevice9::UpdateTexture 中的來源會清除來源紋理上的所有已變更區域。
- 使用 IDirect3DSurface9::GetDC 傳回裝置內容。
- 呼叫 IDirect3DBaseTexture9::GenerateMipSubLevels 會將整個紋理標示為已變更。
- 呼叫 IDirect3DBaseTexture9::SetAutoGenFilterType 會將整個紋理標示為已變更。
已變更區域是在已套用紋理的最上層設定, 而 IDirect3DDevice9::UpdateTexture 可以向下展開 Mip 鏈結中的已變更區域,以便將每個子層級複製的位元組數目降到最低。 請注意,子層級的中途區域座標會向外四捨五入,也就是說,其小數部分會四捨五入到紋理的最接近邊緣。
因為每種紋理類型都有不同類型的已變更區域,所以每個紋理類型都有方法。 2D 紋理使用已變更的矩形,而磁片區紋理則會使用方塊。
- IDirect3DCubeTexture9::AddDirtyRect
- IDirect3DTexture9::AddDirtyRect
- IDirect3DVolumeTexture9::AddDirtyBox
針對上述方法傳遞 pDirtyRect 或 pDirtyBox 參數的 Null 會展開已變更的區域,以涵蓋整個紋理。
每個鎖定方法都可以D3DLOCK_NO_DIRTY_UPDATE,以防止對紋理的已變更狀態進行任何變更。 如需詳細資訊,請參閱 鎖定資源 (Direct3D 9) 。
當鎖定作業期間變更之區域集的詳細資訊可用時,應用程式應該使用D3DLOCK_NO_DIRTY_UPDATE。 請注意,鎖定或複製到紋理子層級 (,也就是說,沒有鎖定或複製到最上層) 不會更新該紋理的已變更區域。 當應用程式鎖定較低層級而不鎖定最上層時,應用程式會承擔更新已變更區域相同的責任。
相關主題