Menghasilkan medan pada GPU

9

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?

pengguna1075940
sumber
8
Perlu diketahui bahwa membuat medan pada GPU akan membuatnya sulit untuk melakukan deteksi tabrakan, memilih deteksi atau hampir semua jenis interaksi dengan medan.
MichaelHouse
1
Compute shader (DX10 atau 11) dapat digunakan untuk menghasilkan medan pada GPU. Tetapi seperti yang dikatakan Byte56, Anda harus menarik kembali nilai-nilai GPU untuk berinteraksi dengannya. msdn.microsoft.com/en-us/library/windows/desktop/…
UnderscoreZero
membuat medan pada jenis GPU terdengar seperti ide yang buruk bagi saya. Mungkin bekerja tetapi saya pikir itu mungkin akan bekerja sedikit lebih baik jika Anda hanya menghasilkan medan di sisi CPU dan mengirim barang gambar standar ke GPU.
Benjamin Danger Johnson
Hanya pengalaman saya; Aku benar-benar melakukan ini dengan aparapi dan benar-benar berhasil; tetapi pada akhirnya menjadi lebih lambat daripada hanya memiliki cpu melakukan pekerjaan. Saya pikir karena overhead pengiriman data ke / dari GPU. Jika saya ingat dengan benar gpu hanya benar-benar berfungsi jika perhitungannya besar dibandingkan dengan ukuran data (dan juga besar secara absolut)
Richard Tingle
Artikel ini mungkin memberi Anda beberapa ide http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Jeremiah Leslie

Jawaban:

2

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.

Akan
sumber