Jadi karena 256 mode warna didepresiasi dan tidak lagi didukung dalam mode Direct3D, saya mendapat ide untuk menggunakan pixel shader sebagai gantinya untuk mensimulasikan palet NES dari semua warna yang mungkin sehingga objek yang memudar dan yang lainnya tidak memiliki fade out yang halus dengan saluran alpha . (Saya tahu objek tidak bisa benar-benar pudar pada SEN, tetapi saya memiliki semua objek yang pudar dan keluar pada latar belakang hitam pekat, yang mungkin terjadi dengan bertukar palet. Juga, layar memudar saat Anda jeda yang saya tahu juga mungkin dengan swapping palet seperti yang dilakukan dalam beberapa game Mega Man.) Masalahnya adalah, saya hampir tidak tahu tentang HLSL shaders.
Bagaimana saya melakukannya?
Jawaban:
Dalam pixel shader, Anda dapat memasukkan 256x256 Texture2D dengan warna palet yang semuanya berbaris secara horizontal dalam satu baris. Maka tekstur NES Anda akan dikonversi menjadi direct3D Texture2Ds dengan piksel yang dikonversi ke nilai indeks 0-255. Ada format tekstur yang hanya menggunakan nilai merah di D3D9. Jadi teksturnya hanya membutuhkan 8bits per pixel, tetapi data yang masuk ke shader adalah dari 0-1.
// Pixel shader mungkin terlihat seperti ini:
EDIT: Cara yang lebih benar adalah dengan menambahkan semua versi palet pencampur yang Anda butuhkan untuk menyelaraskan secara vertikal dalam tekstur dan mereferensikannya dengan nilai 'alpha' colorIndex Anda:
Cara ketiga adalah dengan hanya memalsukan kualitas fade rendah NES dengan toon menaungi warna alfa:
sumber
Jika Anda tidak benar-benar peduli tentang penggunaan memori tekstur (dan gagasan untuk meniup memori tekstur dalam jumlah besar untuk mendapatkan tampilan retro memiliki semacam daya tarik yang keliru), Anda dapat membangun tekstur 3d 256x256x256 memetakan semua kombinasi RGB ke palet yang Anda pilih . Kemudian di shader Anda itu hanya menjadi satu baris kode di akhir:
Bahkan mungkin tidak diperlukan untuk mencapai 256x256x256 - sesuatu seperti 64x64x64 mungkin cukup - dan Anda bahkan dapat mengubah pemetaan palet dengan cepat menggunakan metode ini (tetapi dengan biaya yang signifikan karena pembaruan tekstur dinamis yang besar).
sumber
(kedua solusi saya hanya berfungsi jika Anda tidak peduli tentang mengganti palet dengan menggunakan shader)
Anda dapat menggunakan semua jenis tekstur dan melakukan perhitungan sederhana pada shader. Triknya adalah Anda memiliki lebih banyak informasi warna daripada yang Anda butuhkan, jadi apa yang akan Anda singkirkan adalah informasi yang tidak Anda inginkan.
Warna 8bit dalam format RRRGGGBB . Yang memberi Anda 8 warna merah dan hijau dan 4 warna biru.
Solusi ini akan berfungsi untuk semua tekstur format warna RGB (A).
catatan: saya menulis itu dari atas kepala saya, tetapi saya sangat yakin itu akan dikompilasi dan bekerja untuk Anda
Kemungkinan lain , akan menggunakan format tekstur D3DFMT_R3G3B2 yang sebenarnya sama dengan grafis 8bit. Ketika Anda memasukkan data ke tekstur ini, Anda dapat menggunakan operasi bit sederhana per byte.
sumber