Di mesin saya, saya membuat medan tanpa batas dengan penggunaan perlin noise alghoritm yang dihitung pada CPU.
Pembuatan medan berlangsung seperti ini:
- Jika kamera dekat tambalan yang tidak dimuat, buat itu
- Hitung array noise 513x513 dengan batas yang diberikan
- Hitung normals, tangen, binormal, indeks
- Pass data ke vbo
Pro:
- Hanya perlu diberikan saat dibutuhkan
- Mudah membuat tabrakan
Menipu
- Lambat 64 513x513 tambalan dibuat dalam 3,1s (satu utas). Untuk setiap ubin ~ 20 ms penciptaan kebisingan, ~ 25 ms simpul, normal, singgung, bitangent, indeks. Saat kamera bergerak cepat, pengguna dapat melihat ubin dimuat.
- memakan memori ???
Sekarang saya bertanya-tanya bagaimana cara mempercepat ini dengan menghasilkan medan sepenuhnya pada GPU Tetapi ada beberapa keraguan:
- Jika shader menjalankan setiap frame, bukankah ini penghitungan daya pemborosan untuk menghitung kebisingan berulang kali? Ini dapat dihindari dengan menulis hasil ke dalam tekstur RBGA dan digunakan nanti dalam vertex shader untuk perpindahan, tetapi meningkatkan penggunaan memori. Dari sisi lain jika kreasi akan super cepat, hanya ubin yang terlihat yang harus tetap dalam memori. Namun melepaskan buffer menyebabkan sinkronisasi gpu-cpu yang dapat memperlambat aplikasi (apakah saya benar?)
- Jika medannya hanya berupa grid datar yang dipindahkan oleh vertex shader, pekerjaan yang sama perlu dilakukan pada CPU untuk menghitung tinggi dan normal pada titik yang ditentukan untuk tabrakan.
- Ini hanya sebuah konsep, tetapi untuk mempercepat semuanya, saya berpikir tentang memproyeksikan kisi pada viewport sehingga hanya jumlah minimal simpul yang digunakan. Apakah Anda pikir ini akan berhasil?
Pertanyaan terakhir saya adalah:
Apa teknik terbaik / tercepat / yang digunakan secara luas untuk menciptakan medan tak terbatas pada GPU?
Jawaban:
Nah jika saya mencoba menggunakan GPU untuk hal seperti itu, saya pikir saya akan menggunakan compute / opencl / cuda.
Namun terlepas dari menggunakan GPU atau CPU (yang sebenarnya saya lakukan), saya akan melakukannya dengan cara yang tidak sinkron, memutuskan Anda perlu beberapa medan baru untuk kerangka saat ini kemungkinan sudah terlambat (mis. Pertimbangkan 1000 ms / 60 = 16.666 ms, dan seluruh frame ingin masuk ke dalamnya).
Mulai membuat (atau memuat dari file yang dikompresi) di thread pekerja, dan membuatnya tersedia untuk sisa permainan dan merender setelah pekerja selesai, umumnya ini akan menjadi frame berikutnya, atau mungkin frame setelah itu, jadi pengguna tidak akan benar-benar memperhatikan perbedaan di sana, tetapi itu membuat segalanya lebih lancar.
sumber