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.

ilustrasi buffer vertex yang berisi data posisi

Lebih sering, buffer vertex 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 set elemen per vertex, seperti yang ditunjukkan dalam ilustrasi berikut.

ilustrasi buffer vertex yang berisi data posisi, normal, dan tekstur

Buffer vertex ini berisi data per vertex 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 Metode Gambar).

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 sekuensial indeks 16-bit atau 32-bit; setiap indeks digunakan untuk mengidentifikasi puncak 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.

ilustrasi buffer indeks

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 menyatukan beberapa garis garis atau segitiga dengan memisahkan masing-masing dengan indeks strip-cut. Indeks strip-cut memungkinkan beberapa strip 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.

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

ilustrasi buffer shader-constant

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 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 ID3D10Effect Interface , proses pembuatan, pengikatan, dan kompit buffer konstan ditangani oleh instans ID3D10Effect Interface . 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 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 di ketik 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 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 koordinat tekstur tunggal; ini dapat divisualisasikan sebagai array texel, seperti yang ditunjukkan dalam ilustrasi berikut.

ilustrasi tekstur 1d

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.

ilustrasi tekstur 1d dengan tingkat mipmap

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 (level-of-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.

ilustrasi array tekstur 1d

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

ilustrasi sumber daya tekstur 2d

Sumber daya tekstur ini berisi satu tekstur 3x5 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.

ilustrasi array sumber daya tekstur 2d

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.

ilustrasi array sumber daya tekstur 2d yang mewakili kubus tekstur

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 ditujukan 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 merupakan sumber daya tekstur, ini mungkin berisi tingkat mipmap. Tekstur 3D yang terisi penuh terlihat seperti ilustrasi berikut.

ilustrasi sumber daya tekstur 3d

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. Ikhtisar 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, 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 sub sumber daya yang berarti subkumpulan 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.

ilustrasi tekstur 1d

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.

ilustrasi tekstur 1d dengan tingkat mipmap

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 level-of-detail (LOD) untuk satu tekstur. Saat menggunakan array tekstur, mengakses subtekstur tertentu memerlukan LOD dan tekstur tertentu. Secara bergantian, API menggabungkan dua informasi ini ke dalam satu indeks sub sumber daya berbasis nol seperti yang ditunjukkan di sini.

ilustrasi indeks subresource berbasis nol

Memilih Subresource

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.

ilustrasi splice array

Iringan Mip

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

ilustrasi splice mip

Memilih Subresource Tunggal

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

ilustrasi memilih subsumber daya dengan menggunakan polos array dan splice mip

Memilih Beberapa Subresource

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

ilustrasi 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 dijenis 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 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)