Pemetaan Shadow dan Transparan Quads


10

Pemetaan bayangan menggunakan buffer kedalaman untuk menghitung di mana bayangan harus diambil.

Masalah saya adalah bahwa saya ingin beberapa quads bertekstur semi transparan untuk memberikan bayangan - misalnya pohon billboard. Karena nilai kedalaman akan ditetapkan di semua quad dan bukan hanya bagian yang terlihat itu akan memberikan bayangan quad, yang bukan yang saya inginkan.

Bagaimana saya bisa membuat paha depan transparan saya membuat bayangan yang benar menggunakan pemetaan bayangan?

Jawaban:


15

Masalah Anda akan menyelesaikan rendering dengan alpha 1bit. Yang berarti Anda menentukan beberapa alpha dari tekstur sumber yang tidak dirender (kebanyakan 0,5).

Anda harus menulis shader Anda sendiri untuk menghemat kedalaman dari cahaya dan menggunakan instruksi discard. Buang ada di hlsl, glsl dan juga cg. Itu hanya ada di pixel / fragmen shader dan membuang fragmen curent dari rendering ke backBuffer dan ke z-buffer.

if (texSample.a < 0.5)
   discard;

Keuntungannya adalah Anda tidak perlu mengubah rendering 2nd pass Anda, hanya rendering dengan kedalaman cahaya. Saya juga telah membuktikan bahwa itu bekerja: 1bit alpha

Jika Anda ingin membuat bayangan yang benar untuk beberapa objek transparan, Anda harus menggunakan beberapa tekstur kedalaman, dengan informasi kedalaman dan opacity yang dibuat menggunakan pengelupasan kedalaman. Dan untuk asap, rambut, dll. Peta opacity dalam atau opacity Fourier adalah solusi terbaik (saya kebanyakan merekomendasikan peta opacity Fourier)

sunting: Saya baru menyadari bahwa saya lupa menambahkan kredit. Seperti biasa. Model pohon ini berasal dari proyek loopix yang sangat bagus jika Anda mencari beberapa model lowpoly, satu tekstur dan model vegetasi gratis.


6

Dengan pipeline yang dapat diprogram Anda harus melakukannya sesuai instruksi @notabene. Namun itu mudah dilakukan dengan pipa tetap juga tanpa menulis bayangan. Dalam OpenGL glAlphaFunc adalah apa yang Anda inginkan. Sebagai contoh:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

1
Rapi. Saya benci pipa tetap. Jadi saya sangat mengagumi semua orang yang bisa melakukan hal ini tanpa shader. +1 pasti.
Notabene

@Notabene Sama sekali tidak ada yang mengagumkan tentang penggunaan teknologi yang sudah ketinggalan zaman.
Tara

2

Anda memerlukan shader khusus untuk pembuatan peta bayangan, sehingga Anda dapat menampilkan occluder yang valid ketika transparansi piksel / fragmen lebih besar dari treshold yang Anda tentukan. Whay ini, peta kedalaman akan dihasilkan per pixel dan bukan per poligon.


-1

Satu-satunya cara saya bisa memikirkan melakukan ini adalah membuat tekstur peta kedalaman yang terpisah, merender pohon ke dalamnya, menghasilkan untuk kedalaman di mana alpha! = 0, jika tidak menghasilkan kedalaman = 1, kemudian menggabungkan tekstur peta bayangan ini dengan tekstur peta bayangan adegan , yang seharusnya cukup sederhana; hanya mengambil yang terkecil dari dua nilai dan mengaturnya ke peta kedalaman akhir.

Ini tidak menyelesaikan pesanan campuran; jika Anda menampilkan kedalaman di belakang tekstur alfa, maka akan ditimpa ketika Anda membuat quad dengan tekstur di atasnya, jadi untuk efek ini untuk bekerja Anda harus merender setiap quad secara individual ke dalam tekstur peta kedalaman ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.