Jenis Sumber Daya (Direct3D 10)
Semua sumber daya yang digunakan oleh alur Direct3D berasal dari dua jenis sumber daya dasar: buffer dan tekstur. Buffer adalah kumpulan data mentah (elemen); tekstur adalah kumpulan texel (elemen tekstur).
Ada dua cara untuk sepenuhnya menentukan tata letak (atau jejak memori) sumber daya:
Item | Deskripsi |
---|---|
Diketik |
Tentukan sepenuhnya jenis saat sumber daya dibuat. |
Tanpa jenis |
Tentukan sepenuhnya jenis ketika sumber daya terikat ke alur. |
Sumber Daya Buffer
Sumber daya buffer adalah kumpulan data yang sepenuhnya diketik; secara internal, buffer berisi elemen. Elemen terdiri dari 1 hingga 4 komponen. Contoh jenis data elemen meliputi: nilai data yang dikemas (seperti R8G8B8A8), bilangan bulat 8-bit tunggal, empat nilai float 32-bit. Jenis data ini digunakan untuk menyimpan data, seperti vektor posisi, vektor normal, koordinat tekstur dalam buffer vertex, indeks dalam buffer indeks, atau status perangkat.
Buffer dibuat sebagai sumber daya yang tidak terstruktur. Karena tidak terstruktur, buffer tidak dapat berisi tingkat mipmap apa pun, tidak difilter saat dibaca, dan tidak dapat di-multisampel.
Jenis Buffer
Vertex Buffer
Buffer adalah kumpulan elemen; buffer vertex berisi data per vertex. Contoh paling sederhana adalah buffer vertex yang berisi satu jenis data, seperti data posisi. Ini dapat divisualisasikan seperti ilustrasi berikut.
Lebih sering, buffer vertex berisi semua data yang diperlukan untuk sepenuhnya menentukan simpul 3D. Contohnya bisa berupa buffer vertex yang berisi posisi per vertex, koordinat normal dan tekstur. Data ini biasanya diatur sebagai set elemen per vertex, seperti yang ditunjukkan dalam ilustrasi berikut.
Buffer vertex ini berisi data per vertex untuk delapan simpul; setiap vertex menyimpan tiga elemen (posisi, normal, dan koordinat tekstur). Posisi dan normal masing-masing biasanya ditentukan menggunakan tiga float 32-bit (DXGI_FORMAT_R32G32B32_FLOAT) dan koordinat tekstur menggunakan dua float 32-bit (DXGI_FORMAT_R32G32_FLOAT).
Untuk mengakses data dari buffer vertex, Anda perlu mengetahui vertex mana yang akan diakses dan parameter buffer lainnya ini:
- Offset - jumlah byte dari awal buffer ke data untuk vertex pertama. Offset diberikan ke IASetVertexBuffers.
- BaseVertexLocation - jumlah byte dari offset ke vertex pertama yang digunakan oleh panggilan gambar yang sesuai (lihat Menggambar Metode).
Sebelum membuat buffer vertex, Anda perlu menentukan tata letaknya dengan membuat objek input-layout; ini dilakukan dengan memanggil CreateInputLayout. Setelah objek input-layout dibuat, ikat ke tahap input-assembler dengan memanggil IASetInputLayout.
Untuk membuat buffer vertex, panggil CreateBuffer.
Penyangga Indeks
Buffer indeks berisi sekumpulan indeks 16-bit atau 32-bit berurutan; setiap indeks digunakan untuk mengidentifikasi vertex dalam buffer vertex. Menggunakan buffer indeks dengan satu atau beberapa buffer vertex untuk memasok data ke tahap IA disebut pengindeksan. Buffer indeks dapat divisualisasikan seperti ilustrasi berikut.
Indeks berurutan yang disimpan dalam buffer indeks terletak dengan parameter berikut:
- Offset - jumlah byte dari awal buffer ke indeks pertama. Offset diberikan ke IASetIndexBuffer.
- StartIndexLocation - jumlah byte dari offset ke vertex pertama yang digunakan oleh panggilan gambar yang sesuai (lihat Metode Gambar).
- IndexCount - jumlah indeks yang akan dirender.
Untuk membuat buffer indeks, panggil CreateBuffer.
Buffer indeks dapat menjahit beberapa garis garis atau segitiga dengan memisahkan masing-masing dengan indeks strip-cut. Indeks strip-cut memungkinkan beberapa garis garis atau segitiga digambar dengan satu panggilan gambar. Indeks strip-cut hanyalah nilai maksimum yang mungkin untuk indeks (0xffff untuk indeks 16-bit, 0xffffffff untuk indeks 32-bit). Indeks strip-cut mengatur ulang urutan berliku dalam primitif terindeks dan dapat digunakan untuk menghapus kebutuhan akan segitiga degenerasi yang mungkin diperlukan untuk mempertahankan urutan berliku yang tepat dalam strip segitiga. Ilustrasi berikut menunjukkan contoh indeks strip-cut.
Buffer Konstanta
Direct3D 10 memperkenalkan buffer baru untuk memasok konstanta shader yang disebut buffer shader-constant atau hanya buffer konstan. Secara konseptual, ini terlihat seperti buffer vertex elemen tunggal, seperti yang ditunjukkan dalam ilustrasi berikut.
Setiap elemen menyimpan konstanta komponen 1-ke-4, yang ditentukan oleh format data yang disimpan.
Buffer konstan mengurangi bandwidth yang diperlukan untuk memperbarui konstanta shader dengan memungkinkan konstanta shader dikelompokkan bersamaan dan berkomitmen pada saat yang sama daripada melakukan panggilan individual untuk melakukan setiap konstanta secara terpisah.
Untuk membuat buffer shader-constant, panggil CreateBuffer dan tentukan bendera ikatan buffer konstanta D3D10_BIND_CONSTANT_BUFFER (lihat D3D10_BIND_FLAG).
Untuk mengikat buffer shader-constant ke alur, panggil salah satu metode berikut: GSSetConstantBuffers, PSSetConstantBuffers, atau VSSetConstantBuffers.
Perhatikan bahwa saat menggunakan antarmuka ANTARMUKA ID3D10Effect, proses pembuatan, pengikatan, dan kompit buffer konstan ditangani oleh instans ANTARMUKA ID3D10Effect. Dalam hal ini hanya perlu untuk mendapatkan variabel dari efek dengan salah satu metode GetVariable seperti GetVariableByName dan memperbarui variabel dengan salah satu metode SetVariable seperti SetMatrix. Untuk contoh penggunaan ID3D10Effect Interface untuk mengelola buffer konstan lihat tutorial 07.
Shader terus membaca variabel dalam buffer konstan secara langsung dengan nama variabel dengan variabel cara yang sama yang bukan bagian dari buffer konstan dibaca.
Setiap tahap shader memungkinkan hingga 15 buffer shader-constant; setiap buffer dapat menampung hingga 4096 konstanta.
Gunakan buffer konstanta untuk menyimpan hasil tahap stream-output.
Lihat Shader Constants (DirectX HLSL) untuk contoh mendeklarasikan buffer konstanta dalam shader.
Sumber Daya Tekstur
Sumber daya tekstur adalah kumpulan data terstruktur yang dirancang untuk menyimpan texel. Tidak seperti buffer, tekstur dapat difilter oleh sampler tekstur saat dibaca oleh unit shader. Jenis tekstur memengaruhi bagaimana tekstur difilter. Texel mewakili unit terkecil dari tekstur yang dapat dibaca atau ditulis oleh alur. Setiap texel berisi 1 hingga 4 komponen, disusun dalam salah satu format DXGI (lihat DXGI_FORMAT).
Tekstur dibuat sebagai sumber daya terstruktur sehingga ukurannya diketahui. Namun, setiap tekstur dapat ditik atau mengetik lebih sedikit pada waktu pembuatan sumber daya, selama jenis sepenuhnya ditentukan menggunakan tampilan saat tekstur terikat ke alur.
Jenis Tekstur
Ada beberapa jenis tekstur: 1D, 2D, 3D, yang masing-masing dapat dibuat dengan atau tanpa mipmaps. Direct3D 10 juga mendukung array tekstur dan tekstur multisampel.
Tekstur 1D
Tekstur 1D dalam bentuk paling sederhana berisi data tekstur yang dapat ditangani dengan satu koordinat tekstur; ini dapat divisualisasikan sebagai array texel, seperti yang ditunjukkan dalam ilustrasi berikut.
Setiap texel berisi sejumlah komponen warna tergantung pada format data yang disimpan. Menambahkan lebih banyak kompleksitas, Anda dapat membuat tekstur 1D dengan tingkat mipmap, seperti yang ditunjukkan dalam ilustrasi berikut.
Tingkat mipmap adalah tekstur yang merupakan kekuatan dua lebih kecil dari tingkat di atasnya. Tingkat paling atas berisi detail terbanyak, setiap tingkat berikutnya lebih kecil; untuk mipmap 1D, tingkat terkecil berisi satu texel. Tingkat yang berbeda diidentifikasi oleh indeks yang disebut LOD (tingkat detail); Anda dapat menggunakan LOD untuk mengakses tekstur yang lebih kecil saat merender geometri yang tidak sedekat kamera.
Array Tekstur 1D
Direct3D 10 juga memiliki struktur data baru untuk array tekstur. Array tekstur 1D terlihat secara konseptual seperti ilustrasi berikut.
Array tekstur ini berisi tiga tekstur. Masing-masing dari tiga tekstur memiliki lebar tekstur 5 (yang merupakan jumlah elemen di lapisan pertama). Setiap tekstur juga berisi mipmap 3 lapisan.
Semua array tekstur di Direct3D adalah array tekstur yang homogen; ini berarti bahwa setiap tekstur dalam array tekstur harus memiliki format dan ukuran data yang sama (termasuk lebar tekstur dan jumlah tingkat mipmap). Anda dapat membuat array tekstur dengan ukuran yang berbeda, selama semua tekstur dalam setiap array cocok dalam ukuran.
Tekstur 2D dan Array Tekstur 2D
Sumber daya Texture2D berisi kisi texel 2D. Setiap texel dapat diatasi oleh u, v vektor. Karena ini adalah sumber daya tekstur, mungkin berisi tingkat mipmap, dan sub sumber daya. Sumber daya tekstur 2D yang diisi sepenuhnya terlihat seperti ilustrasi berikut.
Sumber daya tekstur ini berisi tekstur 3x5 tunggal dengan tiga tingkat mipmap.
Sumber daya Texture2DArray adalah array homogen tekstur 2D; artinya, setiap tekstur memiliki format dan dimensi data yang sama (termasuk tingkat mipmap). Ini memiliki tata letak yang sama dengan array tekstur 1D kecuali bahwa tekstur sekarang berisi data 2D, dan karenanya terlihat seperti ilustrasi berikut.
Array tekstur ini berisi tiga tekstur; setiap tekstur adalah 3x5 dengan dua tingkat mipmap.
Menggunakan Texture2DArray sebagai Kubus Tekstur
Kubus tekstur adalah array tekstur 2D yang berisi 6 tekstur, satu untuk setiap wajah kubus. Kubus tekstur yang diisi sepenuhnya terlihat seperti ilustrasi berikut.
Array tekstur 2D yang berisi 6 tekstur dapat dibaca dari dalam shader dengan fungsi intrinsik peta kubus, setelah terikat ke alur dengan tampilan tekstur kubus. Kubus tekstur ditangani dari shader dengan vektor 3D yang menunjuk keluar dari tengah kubus tekstur.
Tekstur 3D
Sumber daya Texture3D (juga dikenal sebagai tekstur volume) berisi volume texel 3D. Karena ini adalah sumber daya tekstur, mungkin berisi tingkat mipmap. Tekstur 3D yang diisi sepenuhnya terlihat seperti ilustrasi berikut.
Ketika irisan mipmap tekstur 3D terikat sebagai output target render (dengan tampilan target render), tekstur 3D berperilaku identik dengan array tekstur 2D dengan n irisan. Ikatan render tertentu dipilih dari tahap geometry-shader, dengan mendeklarasikan komponen skalar data output sebagai nilai sistem SV_RenderTargetArrayIndex.
Tidak ada konsep array tekstur 3D; oleh karena itu, sub sumber daya tekstur 3D adalah tingkat mipmap tunggal.
Subresources
API Direct3D 10 mereferensikan seluruh sumber daya atau subset sumber daya. Untuk menentukan bagian sumber daya, Direct3D telah membuat koin istilah sub sumber daya yang berarti subset sumber daya.
Buffer didefinisikan sebagai subresource tunggal. Tekstur sedikit lebih rumit karena ada beberapa jenis tekstur yang berbeda (1D, 2D, dll.) beberapa di antaranya mendukung tingkat mipmap dan/atau array tekstur. Dimulai dengan kasus paling sederhana, tekstur 1D didefinisikan sebagai sub sumber daya tunggal, seperti yang ditunjukkan dalam ilustrasi berikut.
Ini berarti bahwa array texel yang membentuk tekstur 1D terkandung dalam satu sub sumber daya.
Jika Anda memperluas tekstur 1D dengan tiga tingkat mipmap, tekstur tersebut dapat divisualisasikan seperti ini.
Anggap ini sebagai tekstur tunggal yang terdiri dari tiga subtekstur. Setiap subtekstur dihitung sebagai sub sumber daya, sehingga tekstur 1D ini berisi 3 subresource. Subtekstur (atau sub sumber daya) dapat diindeks menggunakan tingkat detail (LOD) untuk satu tekstur. Saat menggunakan array tekstur, mengakses subtekstur tertentu memerlukan LOD dan tekstur tertentu. Secara bergantian, API menggabungkan kedua informasi ini ke dalam satu indeks sub sumber daya berbasis nol seperti yang ditunjukkan di sini.
Memilih Sub sumber daya
Beberapa API mengakses seluruh sumber daya (misalnya CopyResource), yang lain mengakses sebagian sumber daya (misalnya UpdateSubresource atau CopySubresourceRegion). API yang mengakses sebagian sumber daya umumnya menggunakan deskripsi tampilan (seperti D3D10_TEX2D_ARRAY_DSV) untuk menentukan sub-sumber daya yang akan diakses.
Gambar-gambar ini menggambarkan istilah yang digunakan oleh deskripsi tampilan saat mengakses array tekstur.
Iringan Array
Mengingat array tekstur, setiap tekstur dengan mipmaps, ikatan array (diwakili oleh persegi panjang putih) mencakup satu tekstur dan semua subteksturnya, seperti yang ditunjukkan dalam ilustrasi berikut.
Iringan Mip
Ikatan mip (diwakili oleh persegi panjang putih) mencakup satu tingkat mipmap untuk setiap tekstur dalam array, seperti yang ditunjukkan dalam ilustrasi berikut.
Memilih Subresource Tunggal
Anda dapat menggunakan dua jenis irisan ini untuk memilih satu sub sumber daya, seperti yang ditunjukkan dalam ilustrasi berikut.
Memilih Beberapa Sub sumber daya
Atau Anda dapat menggunakan dua jenis irisan ini dengan jumlah tingkat mipmap dan/atau jumlah tekstur, untuk memilih beberapa sub-sumber daya.
Terlepas dari jenis tekstur apa yang Anda gunakan, dengan atau tanpa mipmaps, dengan atau tanpa array tekstur, Anda dapat menggunakan fungsi pembantu, D3D10CalcSubresource, untuk menghitung indeks sub sumber daya tertentu.
Pengetikan Kuat vs. Lemah
Membuat sumber daya yang sepenuhnya di ketik membatasi sumber daya ke format yang dibuatnya. Ini memungkinkan runtime untuk mengoptimalkan akses, terutama jika sumber daya dibuat dengan bendera yang menunjukkan bahwa itu tidak dapat dipetakan oleh aplikasi. Sumber daya yang dibuat dengan jenis tertentu tidak dapat diinterpretasikan ulang menggunakan mekanisme tampilan.
Dalam sumber daya jenis yang lebih sedikit, jenis data tidak diketahui saat sumber daya pertama kali dibuat. Aplikasi harus memilih dari jenis format yang tersedia lebih sedikit (lihat DXGI_FORMAT). Anda harus menentukan ukuran memori untuk dialokasikan dan apakah runtime perlu menghasilkan subtekstur dalam mipmap. Namun, format data yang tepat (apakah memori akan ditafsirkan sebagai bilangan bulat, nilai titik mengambang, bilangan bulat yang tidak ditandatangani, dll.) tidak ditentukan sampai sumber daya terikat ke alur dengan tampilan. Karena format tekstur tetap fleksibel sampai tekstur terikat ke alur, sumber daya disebut sebagai penyimpanan yang di ketik dengan lemah. Penyimpanan yang dititik lemah memiliki keuntungan dapat digunakan kembali atau diinterpretasikan ulang (dalam format lain) selama bit komponen format baru cocok dengan jumlah bit dari format lama.
Satu sumber daya dapat terikat ke beberapa tahap alur selama masing-masing memiliki tampilan unik, yang sepenuhnya memenuhi syarat format di setiap lokasi. Misalnya, sumber daya yang dibuat dengan format DXGI_FORMAT_R32G32B32A32_TYPELESS dapat digunakan sebagai DXGI_FORMAT_R32G32B32A32_FLOAT dan DXGI_FORMAT_R32G32B32A32_UINT di lokasi yang berbeda di alur secara bersamaan.
Topik terkait