Tahap Output-Merger

Tahap output-merger (OM) menghasilkan warna piksel yang dirender akhir menggunakan kombinasi status alur, data piksel yang dihasilkan oleh shader piksel, konten target render, dan konten buffer kedalaman/stensil. Tahap OM adalah langkah terakhir untuk menentukan piksel mana yang terlihat (dengan pengujian stensil kedalaman) dan memadukan warna piksel akhir.

Perbedaan antara Direct3D 9 dan Direct3D 10:

  • Direct3D 9 mengimplementasikan pengujian alfa (menggunakan status pengujian alfa) untuk mengontrol apakah piksel ditulis ke target render output.
  • Direct3D 10 dan yang lebih tinggi tidak menerapkan uji alfa (atau status pengujian alfa). Ini dapat dikontrol menggunakan shader piksel atau dengan fungsi kedalaman/stensil.

Ringkasan Pengujian Depth-Stencil

Buffer stensil kedalaman, yang dibuat sebagai sumber daya tekstur, dapat berisi data kedalaman dan data stensil. Data kedalaman digunakan untuk menentukan piksel mana yang paling dekat dengan kamera, dan data stensil digunakan untuk menutupi piksel mana yang dapat diperbarui. Pada akhirnya, data nilai kedalaman dan stensil digunakan oleh tahap output-merger untuk menentukan apakah piksel harus digambar atau tidak. Diagram berikut menunjukkan secara konseptual bagaimana pengujian stensil kedalaman dilakukan.

diagram cara kerja pengujian stensil kedalaman

Untuk mengonfigurasi pengujian stensil kedalaman, lihat Mengonfigurasi Fungsionalitas Depth-Stencil. Objek stensil kedalaman merangkum status stensil kedalaman. Aplikasi dapat menentukan status stensil kedalaman, atau tahap OM akan menggunakan nilai default. Operasi pendampingan dilakukan berdasarkan per piksel jika multisampling dinonaktifkan. Jika multisampling diaktifkan, penpaduan terjadi berdasarkan per-multisample.

Proses penggunaan buffer kedalaman untuk menentukan piksel mana yang harus digambar disebut buffering kedalaman, juga kadang-kadang disebut z-buffering.

Setelah nilai kedalaman mencapai tahap output-merger (baik berasal dari interpolasi atau dari shader piksel) nilai tersebut selalu dijepit: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) sesuai dengan format/presisi buffer kedalaman, menggunakan aturan floating-point. Setelah menjepit, nilai kedalaman dibandingkan (menggunakan DepthFunc) terhadap nilai buffer kedalaman yang ada. Jika tidak ada buffer kedalaman yang terikat, tes kedalaman selalu lolos.

Jika tidak ada komponen stensil dalam format buffer kedalaman, atau tidak ada batas buffer kedalaman, maka uji stensil selalu lolos. Jika tidak, fungsionalitas tidak berubah dari Direct3D 9.

Hanya satu buffer kedalaman/stensil yang dapat aktif pada satu waktu; tampilan sumber daya terikat apa pun harus cocok (ukuran dan dimensi yang sama) tampilan kedalaman/stensil. Ini tidak berarti ukuran sumber daya harus cocok, hanya saja ukuran tampilan harus cocok.

Untuk informasi selengkapnya tentang pengujian stensil kedalaman, lihat tutorial 14.

Gambaran Umum Blending

Blending menggabungkan satu atau beberapa nilai piksel untuk membuat warna piksel akhir. Diagram berikut menunjukkan proses yang terlibat dalam memadukan data piksel.

diagram cara kerja blending data

Secara konseptual, Anda dapat memvisualisasikan bagan alur ini yang diimplementasikan dua kali dalam tahap output-merger: yang pertama memadukan data RGB, sementara secara paralel, yang kedua memadukan data alfa. Untuk melihat cara menggunakan API untuk membuat dan mengatur status campuran, lihat Mengonfigurasi Fungsionalitas Blending.

Campuran fungsi tetap dapat diaktifkan secara independen untuk setiap target render. Namun, hanya ada satu set kontrol campuran, sehingga campuran yang sama diterapkan ke semua RenderTargets dengan blending diaktifkan. Nilai campuran (termasuk BlendFactor) selalu dijepit ke rentang format target render sebelum memadukan. Penjepitan dilakukan per target render, dengan menghormati jenis target render. Satu-satunya pengecualian adalah untuk format float16, float11, atau float10 yang tidak dijepit sehingga operasi campuran pada format ini dapat dilakukan dengan setidaknya presisi/rentang yang sama dengan format output. Nol naN dan yang ditandatangani disebarluaskan untuk semua kasus (termasuk bobot campuran 0,0).

Saat Anda menggunakan target render sRGB, runtime mengonversi warna target render menjadi ruang linier sebelum melakukan penpaduan. Runtime mengonversi nilai campuran akhir kembali ke ruang sRGB sebelum menyimpan nilai kembali ke target render.

Perbedaan antara Direct3D 9 dan Direct3D 10:

  • Di Direct3D 9, campuran fungsi tetap dapat diaktifkan secara independen untuk setiap target render.
  • Di Direct3D 10 dan yang lebih tinggi, ada satu deskripsi status campuran; oleh karena itu, satu nilai campuran dapat diatur untuk semua target render.

Dual-Source Penpaduan Warna

Fitur ini memungkinkan tahap output-merger untuk secara bersamaan menggunakan output shader piksel (o0 dan o1) sebagai input ke operasi penpaduan dengan target render tunggal di slot 0. Operasi campuran yang valid meliputi: tambahkan, kurangi, dan revsubtract. Opsi campuran yang valid untuk SrcBlend, DestBlend, SrcBlendAlpha atau DestBlendAlpha meliputi: D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLOR, D3D11_BLEND_SRC1_ALPHA, D3D11_BLEND_INV_SRC1_ALPHA. Persamaan campuran dan masker tulis output menentukan komponen mana yang dihasilkan oleh shader piksel. Komponen tambahan diabaikan.

Menulis ke output shader piksel lainnya (o2, o3 dll.) tidak terdefinisi; Anda mungkin tidak menulis ke target render jika tidak terikat ke slot 0. Menulis oDepth berlaku selama penpaduan warna sumber ganda.

Misalnya, lihat memadukan output shader piksel.

Gambaran Umum Multiple RenderTargets

Shader piksel dapat digunakan untuk merender ke setidaknya 8 target render terpisah, yang semuanya harus berjenis yang sama (buffer, Texture1D, Texture1DArray, dan sebagainya). Selain itu, semua target render harus memiliki ukuran yang sama di semua dimensi (lebar, tinggi, kedalaman, ukuran array, jumlah sampel). Setiap target render mungkin memiliki format data yang berbeda.

Anda dapat menggunakan kombinasi slot target render (hingga 8). Namun, tampilan sumber daya tidak dapat terikat ke beberapa render-target-slot secara bersamaan. Tampilan dapat digunakan kembali selama sumber daya tidak digunakan secara bersamaan.

Ringkasan masker Output-Write

Gunakan masker output-write untuk mengontrol (per komponen) data apa yang dapat ditulis ke target render.

Gambaran Umum Masker Sampel

Masker sampel adalah masker cakupan multisample 32-bit yang menentukan sampel mana yang diperbarui dalam target render aktif. Hanya satu masker sampel yang diizinkan. Pemetaan bit dalam masker sampel ke sampel dalam sumber daya ditentukan oleh pengguna. Untuk penyajian n-sampel, n bit pertama (dari LSB) dari masker sampel digunakan (32 bit jumlah bit maksimum).

Di bagian ini

Topik Deskripsi
Mengonfigurasi Fungsionalitas Depth-Stencil
Bagian ini mencakup langkah-langkah untuk menyiapkan buffer stensil kedalaman, dan status stensil kedalaman untuk tahap output-merger.
Mengonfigurasi Fungsionalitas Blending
Operasi blending dilakukan pada setiap output shader piksel (nilai RGBA) sebelum nilai output ditulis ke target render. Jika multisampling diaktifkan, penpaduan dilakukan pada setiap multisample; jika tidak, penpaduan dilakukan pada setiap piksel.
Bias Kedalaman
Poligon yang merupakan koplanar dalam ruang 3D dapat dibuat untuk muncul seolah-olah mereka tidak koplanar dengan menambahkan bias z (atau bias kedalaman) ke masing-masing.

Alur Grafik

Tahap alur (Direct3D 10)