共用方式為


ID3D10Device::UpdateSubresource 方法 (d3d10.h)

CPU 會將資料從記憶體複製到在不可對應記憶體中建立的 子資源 。 請參閱<備註>。

語法

void UpdateSubresource(
  [in] ID3D10Resource  *pDstResource,
  [in] UINT            DstSubresource,
  [in] const D3D10_BOX *pDstBox,
  [in] const void      *pSrcData,
  [in] UINT            SrcRowPitch,
  [in] UINT            SrcDepthPitch
);

參數

[in] pDstResource

類型: ID3D10Resource*

目的地資源的指標 (請參閱 ID3D10Resource 介面) 。

[in] DstSubresource

類型: UINT

以零起始的索引,可識別目的地子資源。 如需詳細資訊,請參閱 D3D10CalcSubresource

[in] pDstBox

類型:const D3D10_BOX*

一個方塊,定義要複製資源資料的目標子資源部分。 座標是緩衝區的位元組,而紋理的材質則以位元組為單位。 如果 為 Null,則資料會寫入目的地子資源,且沒有位移。 來源的維度必須符合目的地 (請參閱 D3D10_BOX) 。

空方塊會產生無作業。 如果頂端值大於或等於底部值,或左值大於或等於右值,或前端值大於或等於後端值,則方塊是空的。 當方塊是空的時, UpdateSubresource 不會執行更新作業。

[in] pSrcData

類型: const void*

記憶體中來源資料的指標。

[in] SrcRowPitch

類型: UINT

來源資料之一列的大小。

[in] SrcDepthPitch

類型: UINT

來源資料之一深度配量的大小。

傳回值

備註

針對著色器常數緩衝區;將 pDstBox 設定為 Null。 您無法使用這個方法來部分更新著色器常數緩衝區。

如果:

當 UpdateSubresource 傳回時,應用程式可以自由變更或甚至釋出 pSrcData 所指向的資料,因為方法已經複製/貼齊原始內容。

UpdateSubresource 的效能取決於目的地資源是否有爭用。 例如,當應用程式執行 Draw 呼叫,並在實際由 GPU 執行 Draw 呼叫之前,在相同的頂點緩衝區上呼叫 UpdateSubresource 時,就會發生頂點緩衝區資源的爭用。

  • 當資源發生爭用時,UpdateSubresource 會執行 2 個來源資料複本。 首先,CPU 會將資料複製到命令緩衝區可存取的暫存儲存空間。 這個複本會在方法傳回之前發生。 接著,GPU 會執行第二個複本,將來源資料複製到不可對應的記憶體。 第二個複本會以非同步方式發生,因為它會在排清命令緩衝區時由 GPU 執行。
  • 當沒有任何資源爭用時,UpdateSubresource 的行為取決於從 CPU 的觀點 () :將資料複製到命令緩衝區,然後在命令緩衝區排清時執行第二個複本,或讓 CPU 將資料複製到最終資源位置。 這相依于基礎系統的架構。
若要進一步瞭解來源資料列間距和來源深度間距參數,請考慮 3D 磁片區紋理的下圖。 3D 磁片區紋理的圖例

此視覺效果中的每個區塊都代表資料元素,而每個元素的大小取決於資源的格式。 例如,如果資源格式是DXGI_FORMAT_R32G32B32A32_FLOAT,則每個元素的大小會是 128 位或 16 個位元組。 這個 3D 磁片區紋理的寬度為 2、高度為三,深度為四。

若要計算指定資源的來來源資料列間距和來源深度間距,請使用下列公式:

  • 來源資料列間距 = [以位元組為單位的一個專案大小] * [一列中的元素數目]
  • 來源深度間距 = [來源資料列間距] * [ (高度) 的資料列數目]
在此範例 3D 磁片區紋理中,每個元素的大小為 16 個位元組時,公式如下所示:
  • 來源資料列間距 = 16 * 2 = 32
  • 來源深度間距 = 16 * 2 * 3 = 96
下圖顯示資源在記憶體中配置時。 記憶體中 3D 磁片區紋理的圖例

例如,下列程式碼片段示範如何在 2D 紋理中指定目的地區域。 假設目的地紋理為 512x512,作業會將 pData 指向的資料複製到 [ (120,100) 。 (目的地紋理中的 200,220) ]。 此外,假設 rowPitch 已使用適當的值初始化 (,如上述) 所述。 前方和後方分別設定為 0 和 1,因為前方等於後方,方塊技術上是空的。


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 100;
destRegion.bottom = 220;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

1D 案例類似。 下列程式碼片段示範如何在 1D 紋理中指定目的地區域。 使用與上述相同的假設,不同之處在于紋理長度為 512。


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Direct3D 10 與 Direct3D 10.1 之間的差異:

Direct3D 10.1 可讓深度樣板資源當做來源或目的地使用。

規格需求

   
目標平台 Windows
標頭 d3d10.h
程式庫 D3D10.lib

另請參閱

ID3D10Device

ID3D10Resource 介面