Gambar di bawah ini menunjukkan dua sprite yang diberikan dengan pengambilan sampel titik di atas latar belakang:
- Tengkorak kiri tidak memiliki rotasi / penskalaan yang diterapkan padanya, sehingga setiap piksel cocok dengan latar belakang.
- Tengkorak kanan diputar / diskalakan, dan ini menghasilkan piksel yang lebih besar yang tidak lagi sejajar sumbu .
Bagaimana saya bisa mengembangkan pixel shader yang akan membuat sprite yang diubah di sebelah kanan dengan sumbu sejajar pixel dengan ukuran yang sama dengan sisa adegan?
Ini mungkin terkait dengan bagaimana scaling scaling diimplementasikan dalam game lama seperti Monkey Island, karena itulah efek yang saya coba capai, tetapi dengan rotasi ditambahkan.
Edit
Sesuai saran kaoD, saya mencoba mengatasi masalah ini sebagai proses pasca. Pendekatan termudah adalah melakukan render ke target render yang terpisah terlebih dahulu (downsampled agar sesuai dengan ukuran piksel yang diinginkan) dan kemudian meningkatkannya saat rendering kedua kalinya. Itu memang memenuhi persyaratan saya di atas.
Pertama saya mencoba melakukannya Linear -> Point
dan hasilnya adalah ini:
Tidak ada distorsi tetapi hasilnya terlihat buram dan kehilangan sebagian besar warna highlight. Menurut pendapat saya itu merusak tampilan retro yang saya butuhkan.
Kedua kalinya saya mencoba Point -> Point
dan hasilnya adalah ini:
Meskipun distorsi, saya pikir itu mungkin cukup baik untuk kebutuhan saya, meskipun itu terlihat lebih baik sebagai gambar diam daripada bergerak.
Untuk mendemonstrasikan, inilah video efeknya, meskipun YouTube menyaring piksel darinya:
Namun, saya akan membiarkan pertanyaan terbuka selama beberapa hari lagi jika seseorang datang dengan solusi pengambilan sampel yang lebih baik yang mempertahankan tampilan yang tajam sambil mengurangi jumlah distorsi saat bergerak.
sumber
SpriteBatch
mengharuskan saya menggunakan mode Segera, jadi tidak sepadan dengan masalahnya. Saya akan pergi dengan ini :)Jawaban:
Anda harus menerapkan shader SETELAH sprite Anda telah diputar.
Jika seluruh adegan belum diarsir dan sprite Anda benar-benar pixelated, yang Anda butuhkan adalah semacam filter pasca-FX untuk seluruh adegan Anda. Rata-rata wilayah piksel akan berfungsi baik. Ini bukan apa yang Anda maksudkan (itu akan terlihat agak ragu-ragu saat bergerak / berputar) tetapi mungkin melakukan trik.
Satu-satunya cara untuk menjaga agar retro terlihat jujur dengan apa yang Anda inginkan adalah menggambar rotasi sprite Anda sendiri. Ini tidak ada hubungannya dengan bagaimana penskalaan diterapkan: resolusinya sebenarnya buruk, ngomong-ngomong, apakah Anda mencoba dengan resolusi yang sangat rendah? Mungkin juga melakukan trik dan akan terlihat lebih alami karena, yah, sebenarnya itulah yang menyebabkan efek yang Anda cari. Dan itu murah! Sangat murah! Bahkan itu akan lebih murah daripada yang sudah Anda miliki (eksekusi shader kurang fragmen.)
Efeknya hancur pada gambar sampel Anda karena resolusi Anda tinggi dibandingkan dengan sprite Anda, sehingga memungkinkan Anda melihat piksel nyata di tempat kejadian.
sumber
SpriteBatch
dengan pengambilan sampel titik dihidupkan. Tetapi post-fx mungkin benar-benar berhasil. Sebagai permulaan, saya akan mencoba render dengan sampling linier ke target render, dan kemudian render seluruh target render ke backbuffer dengan point sampling.