Berapa banyak tekstur yang biasanya saya ikat sekaligus?

23

Saya sedang mengembangkan mesin gim, dan itu hanya akan bekerja pada perangkat keras modern (model Shader 4+). Saya pikir, pada saat saya selesai dengan itu, itu tidak akan menjadi persyaratan yang tidak masuk akal.

Pertanyaan saya adalah: berapa banyak tekstur yang dapat saya ikat sekaligus pada kartu grafis modern? 16 sudah cukup. Bisakah saya berharap sebagian besar kartu grafis modern mendukung jumlah tekstur itu?

GTX 460 saya tampaknya mendukung 32, tetapi saya tidak tahu apakah itu mewakili sebagian besar kartu video modern.

Avi
sumber
API rendering apa yang Anda gunakan?
Adam
2
OpenGL tentu saja :)
Avi

Jawaban:

53

Jumlah tekstur yang dapat diikat ke OpenGL bukanlah 32 atau 16 . Bukan apa yang Anda dapatkan glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Fungsi itu mengambil jumlah tekstur yang dapat diakses oleh shader fragmen .

Lihat, masing-masing shader memiliki batas sendiri dari jumlah tekstur yang bisa digunakan . Namun, ada juga jumlah total tekstur yang dapat digunakan, titik. Ini didefinisikan (dalam OpenGL) oleh GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Jadi ada dua batasan: tekstur-per-tahap, dan tekstur-total-terikat.

OpenGL 3.x mendefinisikan angka minimum untuk batas per-tahap menjadi 16, sehingga perangkat keras tidak boleh memiliki kurang dari 16 tekstur-per-tahap. Ini dapat memiliki batas yang lebih tinggi, tetapi Anda tahu Anda mendapatkan setidaknya 16. 3.x mendefinisikan angka minimum untuk tekstur-total-terikat sebagai 48. AKA: 16 * 3 tahap. Demikian pula, GL 4.x mendefinisikan angka menjadi 16 tekstur-per-tahap, dan 96 tekstur-total-terikat (yaitu: 16 * 6 tahap, termasuk compute shaders).

Sekali lagi, ini adalah angka minimum . Perangkat keras dapat (dan memang) bervariasi.

Sedangkan untuk perangkat keras tertentu, Anda dapat mengharapkan perangkat keras kelas DX10 mana pun yang cocok dengan angka-angka ini. Perangkat keras kelas DX11 memiliki beberapa varian; NVIDIA (GeForce 4xx +) dan chip AMD kelas atas (alias: GCN-core) mungkin memiliki lebih dari 16-per-tahap.

Nicol Bolas
sumber
2
Saya berharap ini adalah jawaban yang diterima. Itu akan menyelamatkan saya 5 menit dari membaca yang tidak berguna.
Fibbles
3

Saya percaya 32 adalah jumlah maksimum tekstur yang dapat diikat saat ini. Sejauh yang saya tahu bahkan seri 8800 memiliki 32 unit tekstur.

Sejauh yang saya tahu, untuk dukungan OpenGL 4.x Anda akan memerlukan Fermi atau kartu nvidia yang lebih baru (atau kartu amd yang sesuai), semua model kelas atas tampaknya memiliki 32 unit, sedangkan kartu kelas bawah (GT 430, misalnya ) memiliki 16. Namun, melihat lembar spesifikasi AMD mereka mencantumkan angka seperti 80 atau 128 unit tekstur, tetapi daftar 32 unit ROP warna yang tampaknya tetap konstan dari generasi ke generasi.

GTX 480 di sisi lain terdaftar dengan 60 unit tekstur dan 48 unit ROP, sementara kartu akhir yang lebih rendah seperti 430 dilaporkan hanya memiliki 16 unit tekstur dan 4 init ROP. Jadi secara keseluruhan saya tidak benar-benar yakin salah satu dari mereka adalah nomor yang sebenarnya Anda cari.

Anda dapat memeriksa jumlah unit tekstur yang tersedia untuk rendering pipeline fungsi tidak tetap glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, jadi, jika Anda memiliki akses ke beberapa perangkat keras yang beragam, Anda bisa memeriksanya sendiri.

EDIT: situs ini memungkinkan Anda membandingkan kemampuan openGL yang dilaporkan dari semua jenis kartu video, yang akan memberi Anda angka yang Anda butuhkan: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: AMD dan nvidia baru-baru ini memperkenalkan "tekstur bindless", (dan memiliki nama yang berbeda untuk itu) yang memungkinkan Anda untuk menggunakan sejumlah besar tekstur tanpa mengikatnya ke unit textutre, saat ini ini hanya tersedia di openGL.


sumber
1
Setelah itu, jawaban sebenarnya adalah sesuatu seperti 'Anda memiliki sebanyak yang dapat ditawarkannya'. Atau, dengan kata lain, semuanya harus berjalan secepat mungkin. (dan di OpenGL yang mencakup hampir setiap bidang).
Darkwings
@Darkwings Saya kira begitu, mengikat lebih banyak tekstur daripada perangkat keras dapat menangani biasanya akan menyebabkan kesalahan atau waktu driver keluar. Saya juga salah baca, katanya model shader 4+ bukan opengl 4+. Melihat kartu DX10 pertama (kartu X2900 dan 8800 keluarga) mereka semua tampaknya memiliki setidaknya 16 unit tekstur.
Saya baru saja menggarisbawahi fakta bahwa karena dapat parameter, seharusnya. Bahkan jika permainan merangkak pada kartu yang lebih tua, itu seharusnya bukan sesuatu yang sulit dikodekan tetapi 'persyaratan yang disarankan'.
Darkwings
4
-1: Jawaban ini salah. Lihat jawaban saya untuk alasannya (terlalu panjang untuk dijelaskan di sini).
Nicol Bolas
1
Apa yang mungkin tidak segera jelas. Hampir tidak ada yang menggunakan GL_TEXTURE dan GLenums; alih-alih gunakan GL_TEXTURE0 + n, di mana n adalah slot untuk mengikat. GLumen hanya naik hingga 32 slot tetapi itu tidak berarti OpenGL membatasi Anda hingga 32. Spesifikasi menjamin mereka akan berurutan. Juga, jika Anda tidak menggunakan DSA, Anda mungkin ingin memesan slot untuk bind-to-create / memodifikasi, sehingga keadaan yang digunakan untuk membuat / memodifikasi memiliki sedikit interaksi dengan keadaan yang digunakan untuk menggambar.
Maximus Minimus