Saya telah mengerjakan permainan ubin 2D dan saya telah menerapkan pencahayaan yang keras:
Saya ingin sedikit dihaluskan. Saya tidak perlu bayangan atau apa pun, hanya pencahayaan sederhana. Saya ingin terlihat lebih seperti ini:
Sistem saya saat ini menggunakan level cahaya untuk setiap ubin di dunia dan mereka dihitung ulang, ketika ubin ditempatkan atau dihapus. Saya menggunakan batch.setColor(...)
untuk menaungi ubin. Apa cara yang baik untuk mencapai pencahayaan yang halus ini?
Saya tidak ingin menggunakan metode overlay peta cahaya, saya sudah mencobanya dan saya tidak puas dengan hasilnya. Saya ingin dapat mengatur berapa banyak cahaya yang bisa melewati blok. Sebagai contoh, blok tanah harus menyerap sebagian cahaya, tetapi blok kaca seharusnya tidak menghalangi cahaya. Ini tidak mungkin dilakukan dengan metode overlay peta cahaya. UPDATE: Saya salah mengerti apa sebenarnya metode ini. Saya mengerti sekarang. Saya berpikir dengan cara yang salah. Maaf!
Jawaban:
Cara sederhana untuk mencapai pencahayaan halus dalam game berbasis ubin, adalah menggambar "lightmap" ke target render, dan kemudian menggambar target render ini di atas adegan Anda saat alpha memadukannya.
Target render peta cahaya Anda akan menjadi ukuran peta ubin Anda, tetapi dalam piksel. Setiap piksel akan mewakili warna terang ubin yang sesuai. Tekstur render ini akan terlihat seperti ini (tekstur kiri atas hitam dan putih):
Setelah Anda memiliki tekstur peta ringan ini, Anda dapat menggambarnya sebagai hamparan di atas dunia game Anda (terentang). Anda harus menjepitnya dengan benar, sehingga membentang sempurna melampaui ubin Anda di dunia game.
Maka itu adalah masalah alpha memadukan tekstur ini ke dunia gim Anda di libGDX. Untuk berbaur dengan LibGDX (saya pribadi tidak tahu caranya), Anda mungkin harus melihat
Gdx.gl.glBlendFunc
fungsinya.sumber
cara agnostik mesin untuk melakukannya adalah dengan menggunakan pemetaan cahaya rata-rata. Pertama, Anda perlu membuat peta hitam dan putih sebagai array 2D boolean yang merupakan ukuran dunia di mana blok Benar dan kosong adalah Salah.
Suka Ini (1 berwarna hitam, 0 berwarna putih):
Maka Anda perlu membuat array 2D baru yang ukurannya sama dengan array pertama tetapi merupakan array float. Kemudian Anda beralih dari blok hitam (Benar) ke blok hitam dalam array dan rata-rata nilai sampel terdekat (dijelaskan di bawah)
Gambar ini akan membantu:
Gambar ini menunjukkan pengambilan sampel (di mana + berarti false dan | berarti benar). apa yang kita lakukan adalah memperlakukan nilai Benar sebagai 1 dan nilai Salah sebagai 0. Kemudian Anda rata-rata angka 9 dan memasukkannya ke bagian array yang benar. CATATAN: Pastikan bahwa saat Anda mengambil sampel tepian, Anda menggunakan memperlakukan nilai luar sebagai peka konteks. Misalnya: bawah tanah peta di luar dunia mungkin 1 dan langit seharusnya 0.
Seharusnya terlihat seperti ini (diambil dari pos lain):
Maka yang harus Anda lakukan adalah mewarnai setiap blok dengan array
(tint = nilai blok rata-rata saat ini di array kedua dan alpha tidak masalah). Catatan: ini mengasumsikan bahwa rgba pseudo-function mengambil float dari 0-1 bukannya 0-255, jika ya, lakukan saja ini:
Semoga Ini Masuk akal :) Jika Anda ingin kode, tanyakan!
sumber
Karena Anda berbicara tentang hal-hal yang menghalangi cahaya, saya berasumsi Anda memiliki beberapa model untuk bagaimana cahaya seharusnya menyebar. Misalnya segala sesuatu tanpa blok di atasnya benar-benar menyala, cahaya menyebar ke semua sel tetangga tetapi kehilangan sejumlah kecerahan.
Anda harus dapat menerapkan aturan-aturan itu dengan cukup mudah di sisi perangkat lunak setidaknya bagian smoothing kemudian hanya masalah melemparkan beberapa shader di peta cahaya yang telah Anda hasilkan.
Metode yang disarankan orang lain dengan overlay peta cahaya adalah sesuatu yang harus Anda lakukan. Tetapi Anda dapat mengubah cara Anda menghasilkan peta cahaya ini. Pada awalnya Anda dapat mengisinya hanya dengan informasi blokir, tetapi kemudian Anda dapat memperbesar dan memperlancarnya menjadi shader misalnya. Manfaat tambahan dari pendekatan peta cahaya adalah bahwa Anda dapat dengan mudah menarik lampu dinamis ke dalam peta cahaya Anda juga untuk menyoroti ledakan atau apa yang Anda miliki dan secara alami akan menyatu dengan seluruh dunia Anda.
Hal-hal campuran aditif ke dalam peta cahaya Anda kemudian gabungkan multiplikasi peta cahaya Anda dengan dunia game.
Saya melakukan ini beberapa waktu lalu yang menggunakan prinsip yang sama. Sistem ini tidak mendukung penurunan cahaya secara berbeda untuk berbagai jenis medan, tetapi setidaknya harus menggambarkan kegunaan overlay peta cahaya.
sumber
Cukup mudah untuk sebuah obor: menggunakan shader piksel khusus Anda menghitung jarak antara masing-masing fragmen dan obor; Anda kemudian dapat menghitung dari mana ubin padat pertama yang menghalangi cahaya yang berasal dari obor. Anda kemudian menghitung jarak di mana cahaya tidak terhalang, kalikan dengan sesuatu <1 sehingga obor tidak menyalakan matahari, kurangi dari jarak total, dan ulangi untuk sisa jarak (di mana cahaya terhalang oleh pada paling tidak satu ubin) dengan nilai gandakan jauh lebih kecil ... Saya tahu cara melakukan matematika ini dan tidak terlalu rumit untuk diterapkan dalam OpenGL.
EDIT: untuk sumber cahaya sederhana dengan titik tengah tertentu, metode saya sangat sederhana. Namun saya tidak bekerja dengan sinar matahari, tetapi sementara peta alfa bekerja dengan sangat baik untuk sinar matahari, itu TIDAK akan menjadi ide yang baik untuk obor, mengingat bahwa itu berpotensi objek bergerak, dan membuat peta baru setiap frame tidak menyenangkan suatu pengalaman hidup. Solusi terbaik menurut saya adalah campuran: penghitungan jarak untuk lampu tertentu yang sebenarnya adalah objek dalam permainan, shader terpisah yang baru saja Anda lempar di atas peta alfa yang Anda buat secara prosedural dengan menggunakan teknik yang disebutkan di atas: tekstur semua ubin Alpha dari bayangan keras Anda, seperti banyak kotak, dan dipusingkan dengan teknik untuk menghaluskannya.
sumber
Apakah rendering Anda menggunakan warna titik (atau dapatkah Anda mengubahnya)?
Dengan asumsi setiap blok adalah kotak 4-simpul, yang akan memberi Anda beberapa opsi, misalnya:
Jika algoritma pencahayaan Anda saat ini memberi Anda nilai cahaya per blok, Anda bisa mengubahnya untuk memberi Anda nilai per titik. Bergantian, di setiap titik Anda bisa meratakan warna terang dari blok saat ini ditambah tiga tetangganya. Solusi mana pun tidak mahal.
sumber