選擇資源 (Direct3D 10)
資源是 3D 管線使用的一組資料。 建立資源及定義其行為,是應用程式的程式設計首項步驟。 本指引涵蓋基本主題,內容為選擇應用程式所需的資源。
識別需要資源的管線階段
第一個步驟是選擇將使用資源的 管線階段 (或階段) 。 意即,找出會從資源讀取資料以及將資料寫入資源的階段。 了解資源使用所在的管線階段,可決定要呼叫用來將資源繫結至階段的 API。
此表列出可繫結至各管線階段的資源類型, 它包含資源是否可以系結為輸入或輸出,以及系結 API。
管線階段 | 輸入/輸出 | 資源 | 資源類型 | 系結 API |
---|---|---|---|---|
輸入組合器 | 位於 | 頂點緩衝區 | Buffer | IASetVertexBuffers |
輸入組合器 | 位於 | 索引緩衝區 | Buffer | IASetIndexBuffer |
著色器階段 | 位於 | Shader-ResourceView | 緩衝區, Texture1D, Texture2D, Texture3D | VSSetShaderResources、 GSSetShaderResources、 PSSetShaderResources |
著色器階段 | 位於 | Shader-Constant Buffer | Buffer | VSSetConstantBuffers、 GSSetConstantBuffers、 PSSetConstantBuffers |
資料流輸出 | 外 | Buffer | Buffer | SOSetTargets |
輸出合併 | 外 | 轉譯目標檢視 | 緩衝區, Texture1D, Texture2D, Texture3D | OMSetRenderTargets |
輸出合併 | 外 | 深度/樣板檢視 | Texture1D, Texture2D | OMSetRenderTargets |
識別每個資源的使用方式
選擇應用程式要使用的管線階段 (以及各階段需要的資源) 後,下一個步驟為決定各個資源的使用方式,意即 CPU 或 GPU 是否可存取資源。
應用程式執行所在的硬體上至少會有一個 CPU 和一個 GPU。 若要挑選使用量值,請考慮從下列選項讀取或寫入資源的處理器類型, (請參閱 D3D10_USAGE) 。
資源使用狀況 | 可透過下項更新 | 更新的頻率 |
---|---|---|
預設 | GPU | 不常 |
動態 | CPU | 頻繁 |
預備 | GPU | n/a |
固定 | CPU (只能在資源建立的時間) | n/a |
預設使用方式應用於預期不常由 CPU 更新的資源 (少於每畫面一次)。 理想的狀況是,CPU 永遠不會使用預設使用方式直接寫入資源,以避免潛在的效能降低。
動態使用方式應用於相對而言較常由 CPU 更新的資源 (等於或多於每畫面一次)。 動態資源的常見案例為建立動態頂點和索引緩衝區,其會在執行階段由每個畫面使用者視角可見的幾何資料填滿。 這些緩衝區僅會用來轉譯該畫面使用者可見的幾何。
暫存使用方式應用於自其他資源複製資料,以及將資料複製到其中。 常見案例是將使用預設使用方式 (CPU 不能加以存取) 之資源的資料複製到使用暫存使用方式 (CPU 可以加以存取) 的資源。
資源中的資料永遠不會變更時,應使用固定資源。
另一種看待相同想法的方式是,試想應用程式與資源的搭配方式。
應用程式使用資源的方式 | 資源使用狀況 |
---|---|
載入一次且永不更新 | 固定或預設 |
應用程式重複填滿資源 | 動態 |
轉譯至紋理 | 預設 |
CPU 的 GPU 資料存取權 | 預備 |
如果您不確定要選擇哪個使用方式,請先使用預設使用方式,因其是最常見的情形。 著色器常數緩衝區這項資源類型應一律使用預設使用方式。
將資源系結至管線階段
只要資源建立時所指定的限制 (使用旗標、 系結旗標、 cpu 存取旗 標) ,就可以同時系結至多個管線階段。 更明確地說,資源可同時繫結為輸入與輸出,只要不同時發生資源的讀取和寫入部分即可。
繫結資源時,請思考 GPU 和 CPU 存取資源的方式。 為單一目的所設計的資源 (不使用多個使用方式、繫結及 CPU 存取旗標) 效能很有可能更好。
例如,請考量轉譯目標多次作為紋理的案例。 若有兩個資源可能會更快速︰轉譯目標和紋理作為著色器資源。 每個資源只會使用一個系結旗標 (D3D10_BIND_RENDER_TARGET 或 D3D10_BIND_SHADER_RESOURCE) 。 資料會使用 CopyResource 或 CopySubresourceRegion,從轉譯目標紋理複製到著色器紋理。 這可藉由隔離轉譯目標寫入與著色器紋理讀取來改善效能。 當然,唯一的方法是實作這兩種方法,並測量特定應用程式中的效能差異。
相關主題