Bagikan melalui


Mengelola Status Alur Grafis di Direct3D 12

Topik ini menjelaskan bagaimana status alur grafis diatur dalam Direct3D 12.

Gambaran umum status alur

Ketika geometri dikirimkan ke unit pemrosesan grafis (GPU) untuk digambar, ada berbagai pengaturan perangkat keras yang menentukan bagaimana data input ditafsirkan dan dirender. Secara kolektif, pengaturan ini disebut status alur grafis dan mencakup pengaturan umum seperti status rasterizer, status campuran, dan status stensil kedalaman, serta jenis topologi primitif dari geometri yang dikirimkan dan shader yang akan digunakan untuk penyajian. Di Microsoft Direct3D 12, sebagian besar status alur grafis diatur dengan menggunakan objek status alur (PSO). Aplikasi dapat membuat jumlah objek ini yang tidak terbatas, yang diwakili oleh antarmuka ID3D12PipelineState , biasanya pada waktu inisialisasi. Kemudian, pada waktu render, daftar perintah dapat dengan cepat mengalihkan beberapa pengaturan status alur dengan memanggil ID3D12GraphicsCommandList::SetPipelineState dalam daftar perintah langsung atau bundel untuk mengatur PSO aktif.

Dalam Direct3D 11, status alur grafis dibundel ke dalam objek status besar dan kasar seperti ID3D11BlendState yang dapat dibuat dan diatur pada waktu render dalam konteks langsung dengan metode seperti ID3D11DeviceContext::OMSetBlendState. Ide di balik ini adalah bahwa GPU dapat memperoleh efisiensi dengan mengatur pengaturan terkait, seperti pengaturan status campuran, sekaligus. Namun, dengan perangkat keras grafis saat ini, ada dependensi antara unit perangkat keras yang berbeda. Misalnya, status campuran perangkat keras mungkin memiliki dependensi pada status raster serta status campuran. PSO di Direct3D 12 dirancang untuk memungkinkan GPU memproses semua pengaturan dependen di setiap status alur, biasanya selama inisialisasi, untuk membuat peralihan antar status pada waktu render seefisien mungkin.

Perhatikan bahwa meskipun sebagian besar pengaturan status alur diatur menggunakan PSO, ada beberapa pengaturan status yang diatur secara terpisah menggunakan API yang disediakan oleh ID3D12GraphicsCommandList. Pengaturan ini dan API terkait dibahas secara rinci di bawah ini. Selain itu, ada perbedaan dalam cara status alur grafis diwariskan oleh dan bertahan dari daftar perintah langsung dan bundel. Topik ini memberikan detail tentang kedua hal di bawah ini.

Status alur grafik diatur dengan objek status alur

Cara termampu untuk melihat semua status alur berbeda yang dapat diatur menggunakan objek status alur adalah dengan melihat topik referensi untuk D3D12_GRAPHICS_PIPELINE_STATE_DESC yang Anda berikan ke ID3D12Device::CreateGraphicsPipelineState saat Anda menginisialisasi objek. Ringkasan cepat status yang dapat diatur meliputi:

  • Bytecode untuk semua shader termasuk, vertex, piksel, domain, lambung, dan shader geometri.
  • Format vertex input.
  • Jenis topologi primitif. Perhatikan bahwa jenis topologi primitif perakit input (titik, garis, segitiga, patch) diatur dalam PSO menggunakan enumerasi D3D12_PRIMITIVE_TOPOLOGY_TYPE . Kedekatan dan pengurutan primitif (daftar baris, garis garis, garis strip dengan data yang berdekatan, dll.) diatur dari dalam daftar perintah menggunakan metode ID3D12GraphicsCommandList::IASetPrimitiveTopology .
  • Status campuran, status rasterizer, status stensil kedalaman.
  • Stensil kedalaman dan format target render, serta jumlah target render.
  • Parameter multi-pengambilan sampel.
  • Buffer output streaming.
  • Tanda tangan akar. Untuk informasi selengkapnya, lihat Tanda Tangan Akar.

Status alur grafik diatur di luar objek status alur

Sebagian besar status alur grafik diatur menggunakan PSO. Namun, ada sekumpulan parameter status alur yang diatur dengan memanggil metode antarmuka ID3D12GraphicsCommandList dari dalam daftar perintah. Tabel berikut ini memperlihatkan status yang diatur dengan cara ini dan metode yang sesuai.

Provinsi Metode
Pengikatan sumber daya IASetIndexBuffer
IASetVertexBuffers
SOSetTargets
OMSetRenderTargets
SetDescriptorHeaps
Semua SetGraphicsRoot... metode
Semua metode SetComputeRoot...
Viewports RSSetViewports
Scissor rects RSSetScissorRects
Faktor campuran OMSetBlendFactor
Nilai referensi stensil kedalaman OMSetStencilRef
Urutan topologi primitif perakitan input dan jenis kedekatan IASetPrimitiveTopology

Pewarisan status alur grafis

Karena daftar perintah langsung umumnya ditujukan untuk satu penggunaan pada satu waktu dan bundel dimaksudkan untuk digunakan beberapa kali secara bersamaan, ada aturan yang berbeda tentang bagaimana mereka mewarisi status alur grafis yang ditetapkan oleh daftar perintah atau bundel sebelumnya.

Untuk status alur grafik yang diatur menggunakan PSO, tidak ada status ini yang diwarisi oleh daftar perintah langsung atau bundel. Status alur grafis awal untuk daftar perintah langsung dan bundel diatur pada waktu pembuatan dengan parameter ID3D12PipelineState ke ID3D12Device::CreateCommandList. Jika tidak ada PSO yang ditentukan dalam panggilan, status awal default akan digunakan. Anda dapat mengubah PSO saat ini dalam daftar perintah dengan memanggil ID3D12GraphicsCommandList::SetPipelineState.

Daftar perintah langsung juga tidak mewarisi status yang diatur dengan metode daftar perintah seperti RSSetViewports. Untuk detail tentang nilai awal default untuk status non-PSO, lihat ID3D12GraphicsCommandList::ClearState.

Bundel mewarisi semua status alur grafis yang tidak diatur dengan PSO kecuali untuk jenis topologi primitif. Topologi primitif selalu diatur ke D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED ketika bundel mulai dieksekusi. Status apa pun yang diatur dalam bundel (PSO itu sendiri, status berbasis non-PSO, dan pengikatan sumber daya) memengaruhi status daftar perintah langsung induknya. Misalnya, jika RSSetViewports dipanggil dari dalam bundel, viewport yang ditentukan akan terus diatur dalam daftar perintah langsung induk untuk panggilan berikutnya ke panggilan ExecuteBundle yang mengatur viewports.

Pengikatan sumber daya yang diatur dalam daftar perintah atau bundel bertahan. Jadi pengikatan sumber daya yang dimodifikasi dalam daftar perintah langsung masih akan diatur dalam eksekusi bundel anak berikutnya. Dan pengikatan sumber daya yang dimodifikasi dari dalam bundel masih akan diatur untuk panggilan berikutnya dalam daftar perintah langsung induk.

Untuk informasi selengkapnya tentang pengikatan, lihat bagian Semantik Bundel dari Menggunakan Tanda Tangan Akar.