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。 您無法使用這個方法來部分更新著色器常數緩衝區。
如果:
- 資源是使用 不可變 或 動態 使用量建立的。
- 資源會建立為 深度樣板資源。
- 資源是以多重取樣功能建立, (請參閱 DXGI_SAMPLE_DESC) 。
UpdateSubresource 的效能取決於目的地資源是否有爭用。 例如,當應用程式執行 Draw 呼叫,並在實際由 GPU 執行 Draw 呼叫之前,在相同的頂點緩衝區上呼叫 UpdateSubresource 時,就會發生頂點緩衝區資源的爭用。
- 當資源發生爭用時,UpdateSubresource 會執行 2 個來源資料複本。 首先,CPU 會將資料複製到命令緩衝區可存取的暫存儲存空間。 這個複本會在方法傳回之前發生。 接著,GPU 會執行第二個複本,將來源資料複製到不可對應的記憶體。 第二個複本會以非同步方式發生,因為它會在排清命令緩衝區時由 GPU 執行。
- 當沒有任何資源爭用時,UpdateSubresource 的行為取決於從 CPU 的觀點 () :將資料複製到命令緩衝區,然後在命令緩衝區排清時執行第二個複本,或讓 CPU 將資料複製到最終資源位置。 這相依于基礎系統的架構。
此視覺效果中的每個區塊都代表資料元素,而每個元素的大小取決於資源的格式。 例如,如果資源格式是DXGI_FORMAT_R32G32B32A32_FLOAT,則每個元素的大小會是 128 位或 16 個位元組。 這個 3D 磁片區紋理的寬度為 2、高度為三,深度為四。
若要計算指定資源的來來源資料列間距和來源深度間距,請使用下列公式:
- 來源資料列間距 = [以位元組為單位的一個專案大小] * [一列中的元素數目]
- 來源深度間距 = [來源資料列間距] * [ (高度) 的資料列數目]
- 來源資料列間距 = 16 * 2 = 32
- 來源深度間距 = 16 * 2 * 3 = 96
例如,下列程式碼片段示範如何在 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 |