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

Buffer Puncak

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.

illustration of a vertex buffer that contains position data

Lebih sering, buffer verteks berisi semua data yang diperlukan untuk sepenuhnya menentukan simpul 3D. Contohnya bisa menjadi buffer vertex yang berisi posisi per vertex, koordinat normal dan tekstur. Data ini biasanya diatur sebagai kumpulan elemen per vertex, seperti yang ditunjukkan dalam ilustrasi berikut.

illustration of a vertex buffer that contains position, normal, and texture data

Buffer vertex ini berisi data per verteks untuk delapan simpul; setiap puncak 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:

  • 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 tata letak input; 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 set berurutan indeks 16-bit atau 32-bit; 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.

illustration of an index buffer

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 Menggambar Metode).
  • IndexCount - jumlah indeks yang akan dirender.

Untuk membuat buffer indeks, panggil CreateBuffer.

Buffer indeks dapat menggabungkan 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 menghilangkan kebutuhan akan segitiga degenerasi yang mungkin diperlukan untuk mempertahankan urutan berliku yang tepat dalam strip segitiga. Ilustrasi berikut menunjukkan contoh indeks strip-cut.

illustration of a strip-cut index

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.

illustration of a shader-constant buffer

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 bersama dan diterapkan pada saat yang sama daripada melakukan panggilan individual untuk melakukan setiap konstanta secara terpisah.

Untuk membuat buffer shader-constant, panggil CreateBuffer dan tentukan bendera ikat konstanta-buffer 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 cara yang sama yang bukan bagian dari buffer konstanta 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 Konstanta Shader (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 sampel 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 di ketik 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 mipmap. Direct3D 10 juga mendukung array tekstur dan tekstur multisampel.

Tekstur 1D

Tekstur 1D dalam bentuk paling sederhana berisi data tekstur yang dapat ditangani dengan koordinat tekstur tunggal; ini dapat divisualisasikan sebagai array texel, seperti yang ditunjukkan dalam ilustrasi berikut.

illustration of a 1d texture

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.

illustration of a 1d texture with mipmap levels

Tingkat mipmap adalah tekstur yang memiliki 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.

illustration of a 1d texture array

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 vektor u, v. Karena merupakan sumber daya tekstur, sumber daya tersebut mungkin berisi tingkat mipmap, dan subsumber daya. Sumber daya tekstur 2D yang terisi penuh terlihat seperti ilustrasi berikut.

illustration of a 2d texture resource

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.

illustration of an array of 2d texture resources

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 terisi penuh terlihat seperti ilustrasi berikut.

illustration of an array of 2d texture resources that represent a texture cube

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 diatasi dari shader dengan vektor 3D yang menunjuk dari tengah kubus tekstur.

Tekstur 3D

Sumber daya Texture3D (juga dikenal sebagai tekstur volume) berisi volume texel 3D. Karena ini adalah sumber daya tekstur, ini mungkin berisi tingkat mipmap. Tekstur 3D yang diisi sepenuhnya terlihat seperti ilustrasi berikut.

illustration of a 3d texture resource

Saat 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 SV_RenderTargetArrayIndex nilai sistem.

Tidak ada konsep array tekstur 3D; oleh karena itu, subsumber 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 istilah subsumber daya yang berarti subset sumber daya.

Buffer didefinisikan sebagai subsumber daya 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 subsumber daya tunggal, seperti yang ditunjukkan dalam ilustrasi berikut.

illustration of a 1d texture

Ini berarti bahwa array texel yang membentuk tekstur 1D terkandung dalam satu subsumber daya.

Jika Anda memperluas tekstur 1D dengan tiga tingkat mipmap, tekstur tersebut dapat divisualisasikan seperti ini.

illustration of a 1d texture with mipmap levels

Anggap ini sebagai tekstur tunggal yang terdiri dari tiga subtekstur. Setiap subtekstur dihitung sebagai sub sumber daya, sehingga tekstur 1D ini berisi 3 subsumber daya. Subtekstur (atau sub sumber daya) dapat diindeks menggunakan level-of-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 subresource berbasis nol seperti yang ditunjukkan di sini.

illustration of a zero-based subresource index

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 subsumber 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.

illustration of an array splice

Mip Slice

Ikatan mip (diwakili oleh persegi panjang putih) mencakup satu tingkat mipmap untuk setiap tekstur dalam array, seperti yang ditunjukkan dalam ilustrasi berikut.

illustration of a mip splice

Memilih Subresource Tunggal

Anda dapat menggunakan kedua jenis irisan ini untuk memilih satu sub sumber daya, seperti yang diperlihatkan dalam ilustrasi berikut.

illustration of choosing a subresource by using an array slice and a mip splice

Memilih Beberapa Sub-Sumber Daya

Atau Anda dapat menggunakan kedua jenis irisan ini dengan jumlah tingkat mipmap dan/atau jumlah tekstur, untuk memilih beberapa subsumber daya.

illustration of choosing multiple subresources

Terlepas dari jenis tekstur apa yang Anda gunakan, dengan atau tanpa mipmap, dengan atau tanpa array tekstur, Anda dapat menggunakan fungsi pembantu, D3D10CalcSubresource, untuk menghitung indeks subsumber daya tertentu.

Pengetikan Kuat vs. Lemah

Membuat sumber daya yang sepenuhnya ditik 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 jenis sumber daya 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 yang akan 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 ditik dengan lemah. Penyimpanan yang ditik lemah memiliki keuntungan dapat digunakan kembali atau diinterpretasikan kembali (dalam format lain) selama bit komponen format baru cocok dengan jumlah bit 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.

Sumber daya (Direct3D 10)