Bagaimana GPU menangani tekstur dan VRAM?

18

Ini sebenarnya banyak pertanyaan yang saling terkait:

  1. Apakah tekstur terkompresi (dxt5 / dxt1 dll) pernah benar-benar didekompresi saat melalui render pipeline?

  2. Jika jawaban untuk pertanyaan pertama benar, lalu bagaimana cara mengatur memori untuk beberapa tekstur besar yang tidak terkompresi?

  3. Apakah framebuffer berbeda dari VRAM dalam GPU modern?

Allahjane
sumber

Jawaban:

29

Format tekstur terkompresi GPU seperti DXT / BC / ETC dirancang khusus untuk dibaca langsung dari bentuk terkompresi. Mereka tidak perlu dibongkar menjadi buffer RGBA mentah.

Cara kerjanya adalah setiap blok texels (seringkali 4x4) membutuhkan jumlah bit yang tetap - jadi kami tahu persis seberapa jauh di buffer untuk mencari texel tertentu - dan blok ini dapat didekompresi tanpa membaca semua sekelilingnya / Informasi tekstur sebelumnya. GPU berisi perangkat keras khusus yang hanya mendekompresi blok texel yang diminta sesuai kebutuhan untuk memenuhi permintaan pengambilan sampel tekstur dari shader Anda.

Ini berbeda dengan format seperti jpg & png, di mana jumlah ruang yang dibutuhkan setiap texel dapat bervariasi di seluruh gambar (area terperinci yang mengambil lebih banyak data, area yang dapat diprediksi mengambil lebih sedikit), sehingga untuk menemukan texel tertentu yang harus Andaekompresi seluruh gambar, atau setidaknya potongan besar / didistribusikan itu. Tetapi karena mereka dapat secara selektif mengompres area yang dapat diprediksi dari suatu tekstur, mereka cenderung mengompres gambar ke ukuran yang lebih kecil untuk penyimpanan pada disk atau transmisi melalui jaringan daripada apa yang kita dapatkan dari format yang ramah GPU. Strategi yang berbeda untuk penggunaan yang berbeda.


Secara umum, mengajukan beberapa pertanyaan harus dilakukan melalui banyak posting, tetapi karena ini adalah jawaban yang cukup singkat, saya akan mencapai poin 3 juga:

" Framebuffer " hanyalah sedikit memori video tertentu yang telah kami putuskan untuk digunakan untuk menyimpan gambar yang dikomposisikan yang ingin kami tampilkan ke layar. Perhatikan detail dalam jawaban JarkkoL, di mana pada beberapa perangkat keras khusus kita dapat memilih untuk menempatkan buffer ini di bagian tertentu dari memori video kami yang tersedia yang dioptimalkan untuk kebutuhan bandwidth target render.

DMGregory
sumber
Tautan pada algoritma kompresi ini sangat membantu dan mendalam. Temuan yang bagus!
Coburn
7

Jawaban untuk pertanyaan Anda sangat tergantung pada platform. Umumnya format BC disimpan dalam bentuk terkompresi dalam memori dan dekompresi dilakukan dalam penerbangan oleh unit tekstur GPU, tetapi ada pengecualian. Yaitu Xbox 360 dikenal untuk mendekompresi blok BC 4 x 4 piksel lengkap untuk cache sebelum TU mengambil data sehingga menggembungkan penggunaan cache. Saya tidak tahu platform apa pun yang akan mendekompresi seluruh tekstur untuk vram pada beban, tapi saya sangat meragukannya karena penambahan memori dan penggunaan bandwidth.

Hal yang sama berlaku untuk framebuffer - itu tergantung pada platform. Di Xbox 360 Anda memiliki 10MB EDRAM bandwidth tinggi khusus yang harus Anda gunakan untuk membuat target. Di Xbox One Anda masih memiliki 32MB ESRAM khusus yang lebih disukai untuk target render karena bandwidth tinggi (dan juga dapat diambil dari tidak seperti di Xbox 360), tetapi target render juga dapat berada dalam memori DDR3 biasa.

JarkkoL
sumber