Pengambilan sampel tekstur direct3D sangat lambat

9

Jadi saya menulis sebuah game kecil menggunakan Direct3D 9 dan saya menggunakan multitexturing untuk medannya. Yang saya lakukan hanyalah mencicipi 3 tekstur dan peta campuran dan mendapatkan warna keseluruhan dari tiga tekstur berdasarkan saluran warna dari peta campuran. Bagaimanapun, saya mendapatkan penurunan frame rate yang besar ketika saya mencicipi lebih dari 1 tekstur, saya beralih dari 120+ fps menjadi hanya di bawah 50.

Ini adalah kode HLSL yang bertanggung jawab untuk memperlambat:

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

Apakah saya salah? Jika ada yang punya info atau tips tentang pengambilan sampel tekstur atau apa pun, itu akan menyenangkan.

Terima kasih.

dotminik
sumber
Perangkat keras apa yang Anda miliki? Empat sampel tekstur seharusnya tidak menjadi masalah pada perangkat keras baru.
Axel Gneiting
Saya punya Radeon X1950, ya sudah beberapa tahun, kalau tidak lebih. Saya kira itu mungkin bukan perangkat keras terbaik. Bagaimana menurut anda ?
dotminic

Jawaban:

9

Jika Anda ingin mempercepat, Anda dapat menggunakan sesuatu yang disebut atlas tekstur.

Wikipedia - Atlas tekstur adalah gambar besar, atau "atlas" yang berisi banyak gambar kecil, yang masing-masingnya adalah tekstur untuk beberapa bagian dari objek 3D. Sub-tekstur dapat diterjemahkan dengan memodifikasi koordinat tekstur uvmap objek pada atlas, yang pada dasarnya memberitahukan bagian gambar yang teksturnya berada. Dalam aplikasi di mana banyak tekstur kecil sering digunakan, seringkali lebih efisien untuk menyimpan tekstur dalam atlas tekstur yang diperlakukan sebagai satu unit oleh perangkat keras grafis.

Ini lebih efisien untuk GPU untuk sampel tekstur tunggal besar 4 kali dibandingkan 4 gambar sampel masing-masing. Berikut adalah contoh atlas tekstur medan.

teks alternatif

zfedoran
sumber
1
Terima kasih atas sarannya, saya telah mengimplementasikan shader saya menggunakan atlas tekstur, saya "hanya" mendapatkan 109fps sekarang, tetapi ini merupakan peningkatan yang rapi dari 55fps yang saya dapatkan. Terima kasih!
dotminic
1
+1 untuk jawaban yang bagus. Bolehkah saya bertanya di mana Anda mendapatkan gambar atlas tekstur itu? Apakah properti atau gratis untuk penggunaan apa pun?
Cameron
4

Satu hal yang perlu dipertimbangkan adalah format tekstur. Apakah ini tekstur mentah 32bpp? Jika demikian, pertimbangkan untuk menggunakan tekstur DXT1 terkompresi, yaitu 4 bit / piksel (mengambil 1/8 ruang), atau DXT5 jika Anda membutuhkan saluran alfa, pada 8 bit / piksel.

Mengurangi ukuran data tekstur harus mengurangi kebutuhan bandwidth memori tekstur, dan meningkatkan kinerja cache tekstur.

Juga, periksa apakah Anda belum menetapkan penyaringan anisotropik kualitas maksimum - yang dapat menambah sedikit biaya.

bluescrn
sumber
Terima kasih untuk sarannya, saya akan coba lagi lain kali.
dotminic
3

Apakah tekstur Anda memiliki mipmaps?

Tanpa pemetaan, tekstur sampel bisa sangat mahal (banyak cache yang hilang)

bluescrn
sumber
Yap teksturnya memiliki mipmaps, saya mengekspornya sebagai * .dds dari alat tekstur DirectX. Tetapi bagaimana mereka menggunakan tekstur dalam permainan komersial di mana ada banyak tekstur def tinggi di semua tempat? Saya hanya mencicipi 1 tekstur atlas dan mendapatkan kecepatan bingkai 109 fps saat merender medan, semuanya ada di GPU.
dotminic