Efek GLSL Shader: Bagaimana cara melakukan blur?


16

Saya memiliki lingkungan 2D penuh, dengan sprite di sekitar sebagai lanskap, karakter, dll.

Untuk membuatnya lebih canggih, saya ingin menerapkan efek blur, mirip dengan game FPS modern (yaitu Crysis) blur saat menggerakkan kamera dengan cepat.

Dalam sidescroller, efek yang diinginkan adalah memiliki sedikit kekaburan ini muncul untuk memberikan gagasan tentang gerakan cepat ketika kamera bergerak. Jika ada yang bisa memberi saya beberapa tips untuk melakukan ini, saya berasumsi dalam pixel shader, saya akan berterima kasih.


Simpan beberapa salinan buffer yang Anda buat. Misalnya, blur empat frame sebelumnya untuk membuat frame Anda saat ini. Itu akan menciptakan efek yang Anda inginkan.
knight666

@ knight666 bukankah lebih baik (memori tentunya, kecepatan saya tidak yakin) untuk menyimpan 1 buffer tambahan (sebut saja A) dan daripada mencampur sebagian (katakanlah 0,75) dengan buffer output (pergi ke layar, sebut saja B) dan kemudian salin B ke A sesudahnya. Ini akan membuat rata-rata bergulir dan meningkatkan blur gerakan tidak akan dikenakan biaya tambahan.
Elva

1
Saya bermaksud membuat ini sebagai komentar, tetapi tidak dapat menemukan tombol komentar. Ngomong-ngomong, apa yang Dave O. katakan mungkin yang terbaik dan apa yang digunakan dalam game seperti Crysis. Ini bekerja sedikit seperti ini. Selama render objek, Render kecepatan objek menjadi buffer terpisah. MRT akan membuat ini sedikit lebih cepat, dan ada beberapa cara untuk menghitung kecepatan, tetapi Anda ingin berakhir dengan buffer tambahan yang memiliki kecepatan untuk seluruh buffer render. Kemudian dalam shader pasca-proses, berdasarkan pada kecepatan di setiap piksel, Anda sampel ke buffer warna dalam arah yang berlawanan dari veloc
Arelius

Kode HLSL / Cg pada Listing 27-1 menggunakan persamaan sebelumnya dalam shader piksel pasca-pemrosesan layar penuh untuk menghitung posisi ruang-dunia objek yang dirender pada piksel tertentu, menggunakan buffer kedalaman dan kebalikan dari arus. lihat-proyeksi matriks. ... HLSL .... Dalam kode Anda ini bukan GLSL .....

Jawaban:


6

Simpan salinan framebuffer terakhir. Dapatkan vektor gerakan kamera dan balikkan. Gambar adegan Anda seperti biasa, lalu gambar framebuffer terakhir dengan sedikit offset (delta kamera yang baru saja Anda hitung) dan 0,75 alpha. Ulangi sebanyak yang Anda suka untuk memberikan efek blur pada gerakan.


1
Pendekatan ini sangat mudah diimplementasikan tetapi sangat sulit untuk fine tune (dapat terlihat seperti objek yang meninggalkan jejak bukannya kabur). Pendekatan lain yang juga sederhana adalah "mengotori" piksel dalam arah gerakan kamera terbalik dalam shader piksel pemrosesan pos.
Dave O.

6
Masalah utama dengan pendekatan ini adalah bahwa itu tergantung pada framerate - itu akan terlihat sangat berbeda jika Anda menjalankan pada 20 fps untuk bagaimana tampilannya jika Anda berjalan pada 100 fps. Selama Anda menyadarinya dan mendapatkan hasil yang Anda inginkan di framerate yang Anda jalankan tidak apa-apa, tetapi Anda perlu menyadarinya.
Maximus Minimus

19

Saya akan merekomendasikan menggunakan metode ini: Motion Blur sebagai Efek Post-Processing

Sangat sederhana untuk diimplementasikan, ini adalah yang saya gunakan di demo Ruin island glsl saya [tautan]


Metode ini jauh lebih unggul daripada pencampuran dalam bingkai masa lalu ...
Steven Lu

Seperti sekarang, jawaban ini hanya menyediakan tautan. Jika tautan rusak di masa mendatang, tidak ada yang akan tahu bagaimana sebenarnya memecahkan masalah mereka. Cobalah setidaknya untuk memasukkan informasi penting yang diberikan tautan itu kepada Anda

Ya, mari kita buat salinan dari Internet, karena salinan itu sama sekali tidak akan rusak: J
SasQ
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.