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?