Apa itu buffer stensil?

26

Wikipedia menyatakan bahwa buffer stensil adalah buffer sewenang-wenang yang dapat digunakan oleh shader.

Namun, itu mengisyaratkan bahwa itu digunakan untuk kliping, atau "mengikat dengan ketat" kedalaman dan penyangga piksel, sedikit bertentangan dengan dirinya sendiri.

Apa yang sebenarnya dilakukan buffer stensil , dan bagaimana cara praktis digunakan dalam aplikasi modern?

Qix
sumber

Jawaban:

31

Definisi buffer stensil oleh Wikipedia memang tidak bagus, terlalu banyak berfokus pada detail implementasi modern (OpenGL). Saya menemukan versi disambiguasi lebih mudah untuk dipahami:

Stensil adalah template yang digunakan untuk menggambar atau melukis huruf, simbol, bentuk, atau pola yang identik setiap kali digunakan. Desain yang dihasilkan oleh template semacam itu juga disebut stensil.

Itulah yang dimaksud stensil sebelum Komputer Grafik. Jika Anda mengetik stensil pada Gambar Google, ini adalah salah satu hasil pertama:

Masker stensil

Seperti yang Anda lihat, itu hanyalah topeng atau pola yang dapat digunakan untuk "melukis" negatif dari pola ke sesuatu.

The stensil penyangga karya dengan cara yang sama persis. Seseorang dapat mengisi buffer stensil dengan pola yang dipilih dengan melakukan pass render pas stensil, kemudian mengatur fungsi stensil yang sesuai yang akan menentukan bagaimana pola ditafsirkan pada gambar berikutnya, kemudian memberikan adegan terakhir. Piksel yang jatuh ke area yang ditolak dari topeng stensil, sesuai dengan fungsi perbandingan, tidak digambar.


Ketika datang untuk menerapkan buffer stensil, kadang-kadang memang ditambah dengan buffer kedalaman. Sebagian besar perangkat keras grafis menggunakan buffer stensil 1 byte (8 bit), yang cukup untuk sebagian besar aplikasi. Buffer kedalaman biasanya diimplementasikan menggunakan 3 byte (24 bit), yang lagi-lagi biasanya cukup untuk sebagian besar jenis rendering 3D. Jadi masuk akal untuk mengemas 8 bit buffer stensil dengan 24 bit buffer kedalaman lainnya, sehingga memungkinkan untuk menyimpan setiap kedalaman + piksel stensil ke dalam integer 32 bit. Itulah yang dimaksud oleh Wikipedia:

Buffer kedalaman dan buffer stensil sering berbagi area yang sama dalam RAM perangkat keras grafis.


Satu aplikasi di mana penyangga stensil digunakan untuk menjadi raja adalah untuk rendering bayangan, dalam teknik yang disebut volume bayangan , atau kadang-kadang juga secara tepat disebut bayangan stensil . Ini adalah penggunaan buffer yang sangat pintar, tetapi saat ini sebagian besar bidang rendering tampaknya telah bergeser ke arah peta bayangan berbasis kedalaman.

Glampert
sumber
Itu satu karakter, tapi cleaver-> clever. Saya tidak dapat mengeditnya D: Jawaban yang bagus, ini masuk akal sejauh ini.
Qix
3
Jika Anda memiliki shader per-pixel yang mahal, buffer stensil juga dapat digunakan untuk mengumpankan utas yang serupa, mengurangi divergensi dan meningkatkan hunian seperti pada kertas OIT ini, bagian 2.6 (penafian: saya seorang penulis).
jozxyqk
@ Jozxyqk, itu beberapa di luar kotak berpikir di sana! Sangat bagus.
glampert
13

Buffer stensil adalah buffer integer yang tidak ditandatangani, biasanya 8-bit saat ini, di mana Anda dapat mengisi informasi per-pixel sesuai keinginan berdasarkan penggunaan berbagai operasi ( OpenGL Ops di sini misalnya ) mengikuti tes stensil.

Tes stensil hanyalah operasi per-pixel di mana nilai stensil piksel saat ini diuji terhadap konten buffer stensil. Anda mengatur kondisi di mana uji stensil dilewatkan (mis. SELALU, KURANG, dll.).

Anda dapat memutuskan apa yang terjadi pada nilai stensil tergantung pada hasil tes (di OpenGL menggunakan operasi yang saya tautkan dengan Anda di atas)

Buffer stensil memiliki beberapa kegunaan, yang pertama muncul dalam pikiran adalah:

  • Ini dapat digunakan sebagai topeng untuk secara selektif membuat bagian tertentu dari framebuffer dan membuang sisanya. Ini, misalnya, berguna untuk refleksi, tetapi juga banyak lagi. Saat menangani rendering resolusi berganda, resolusi ini dapat digunakan untuk menandai tepi yang perlu dirender pada resolusi yang lebih tinggi. Ada banyak penggunaan masking sebenarnya.
  • Filter overdraw yang sangat sederhana misalnya. Anda dapat mengatur tes stensil untuk selalu lulus dan selalu menambah nilainya. Nilai yang Anda dapatkan di buffer stensil mewakili penarikan berlebih Anda. [*]

Di masa lalu telah digunakan juga untuk teknik membayangi seperti volume Shadow.

Buffer stensil yang buruk sering sangat diremehkan, tetapi bisa menjadi senjata yang bagus di gudang programmer grafis.

[*] Nilai untuk dibaca kembali dalam proses pasca menggunakan SRV yang tepat!

EDIT: Juga, perlu disebutkan bahwa dalam Shader Model 5.1 (jadi D3D11.3 dan D3D12) Anda memiliki akses ke nilai referensi stensil melalui SV_StencilRef

cifz
sumber
6

Buffer stensil berisi data integer per-piksel yang digunakan untuk menambahkan kontrol lebih besar atas piksel mana yang diberikan.

Buffer stensil beroperasi mirip dengan buffer kedalaman. Demikian juga, data stensil disimpan dalam buffer kedalaman. Sementara data kedalaman menentukan piksel mana yang paling dekat dengan kamera, data stensil dapat digunakan sebagai masker per-piksel yang lebih umum untuk menyimpan atau membuang piksel. Untuk membuat topeng, gunakan fungsi stensil untuk membandingkan nilai stensil referensi - nilai global - dengan nilai dalam buffer stensil setiap kali piksel diberikan.

Sumber: Apa itu Penyangga Stensil? | Jaringan Pengembang Microsoft

Ide umum adalah bahwa Anda dapat menetapkan nilai untuk setiap pixel dan kemudian mengatur operasi ( GREATER, SMALLER, EQUALdll), ketika mengevaluasi ini untuk benar pixel berbayang dan ditampilkan.

Salah satu aplikasi adalah refleksi realtime, ketika rendering tekstur refleksi buffer stensil digunakan untuk membuat topeng di mana refleksi diterapkan. Misalnya hanya menerapkan pantulan kaca untuk material yang diarsir. Itu juga dapat digunakan untuk membuat topeng dua dimensi yang sewenang-wenang untuk seluruh framebuffer.

Maurice Laveaux
sumber