Pengantar Sumber Daya di Direct3D 11
Sumber daya adalah blok penyusun adegan Anda. Mereka berisi sebagian besar data yang digunakan Direct3D untuk menafsirkan dan merender adegan Anda. Sumber daya adalah area dalam memori yang dapat diakses oleh alur Direct3D. Sumber daya berisi jenis data berikut: geometri, tekstur, data shader. Topik ini memperkenalkan sumber daya Direct3D seperti buffer dan tekstur.
Anda dapat membuat sumber daya yang sangat ditik atau tanpa jenis; Anda dapat mengontrol apakah sumber daya memiliki akses baca dan tulis; Anda dapat membuat sumber daya hanya dapat diakses oleh CPU, GPU, atau keduanya. Hingga 128 sumber daya dapat aktif untuk setiap tahap alur.
Direct3D menjamin untuk mengembalikan nol untuk sumber daya apa pun yang diakses di luar batas.
Siklus hidup sumber daya Direct3D adalah:
- Buat sumber daya menggunakan salah satu metode buat antarmuka ID3D11Device .
- Ikat sumber daya ke alur menggunakan konteks dan salah satu metode set antarmuka ID3D11DeviceContext .
- Batalkan alokasi sumber daya dengan memanggil metode Rilis antarmuka sumber daya.
Bagian ini berisi topik berikut:
Pengetikan Kuat vs Lemah
Ada dua cara untuk sepenuhnya menentukan tata letak (atau jejak memori) sumber daya:
- Ditik - tentukan sepenuhnya jenis saat sumber daya dibuat.
- Tanpa jenis - sepenuhnya menentukan jenis ketika sumber daya terikat ke alur.
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 diinterpresikan kembali menggunakan mekanisme tampilan kecuali sumber daya dibuat dengan bendera D3D10_DDI_BIND_PRESENT. Jika D3D10_DDI_BIND_PRESENT diatur, tampilan sumber daya render-target atau shader dapat dibuat pada sumber daya ini menggunakan salah satu anggota keluarga yang sepenuhnya diketik, bahkan jika sumber daya asli dibuat sebagai sepenuhnya diketik.
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 sumber daya. 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 jumlah komponen dan jumlah bit setiap komponen sama dalam kedua format.
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.
Tampilan Sumber Daya
Sumber daya dapat disimpan dalam format memori tujuan umum sehingga dapat dibagikan oleh beberapa tahap alur. Tahap alur menginterpretasikan data sumber daya menggunakan tampilan. Tampilan sumber daya secara konseptual mirip dengan transmisi data sumber daya sehingga dapat digunakan dalam konteks tertentu.
Tampilan dapat digunakan dengan sumber daya tanpa jenis. Artinya, Anda dapat membuat sumber daya pada waktu kompilasi dan mendeklarasikan jenis data saat sumber daya terikat ke alur. Tampilan yang dibuat untuk sumber daya tanpa jenis selalu memiliki jumlah bit yang sama per komponen; cara data ditafsirkan tergantung pada format yang ditentukan. Format yang ditentukan harus dari keluarga yang sama dengan format tanpa jenis yang digunakan saat membuat sumber daya. Misalnya, sumber daya yang dibuat dengan format R8G8B8A8_TYPELESS tidak dapat dilihat sebagai sumber daya R32_FLOAT meskipun kedua format mungkin berukuran sama dalam memori.
Tampilan juga memaparkan kemampuan lain seperti kemampuan untuk membaca permukaan kedalaman/stensil belakang dalam shader, menghasilkan cubemap dinamis dalam satu pass, dan merender secara bersamaan ke beberapa irisan volume.
Antarmuka Sumber Daya | Deskripsi |
---|---|
ID3D11DepthStencilView | Akses sumber daya tekstur selama pengujian stensil kedalaman. |
ID3D11RenderTargetView | Akses sumber daya tekstur yang digunakan sebagai target render. |
ID3D11ShaderResourceView | Akses sumber daya shader seperti buffer konstanta, buffer tekstur, tekstur, atau sampler. |
ID3D11UnorderedAccessView | Akses sumber daya yang tidak berurutan menggunakan shader piksel atau shader komputasi. |
Tampilan Mentah Buffer
Anda dapat memikirkan buffer mentah, yang juga dapat disebut buffer alamat byte, sebagai sekantong bit yang Anda inginkan akses mentahnya, yaitu buffer yang dapat Anda akses dengan mudah melalui potongan satu hingga empat nilai alamat tanpa jenis 32-bit. Anda menunjukkan bahwa Anda menginginkan akses mentah ke buffer (atau, tampilan mentah buffer) saat Anda memanggil salah satu metode berikut untuk membuat tampilan ke buffer:
- Untuk membuat tampilan sumber daya shader (SRV) ke buffer, panggil ID3D11Device::CreateShaderResourceView dengan bendera D3D11_BUFFEREX_SRV_FLAG_RAW. Anda menentukan bendera ini di anggota Bendera dari struktur D3D11_BUFFEREX_SRV . Anda mengatur D3D11_BUFFEREX_SRV di anggota BufferEx dari struktur D3D11_SHADER_RESOURCE_VIEW_DESC tempat parameter pDescID3D11Device::CreateShaderResourceView menunjuk. Anda juga mengatur nilai D3D11_SRV_DIMENSION_BUFFEREX di anggota ViewDimensionD3D11_SHADER_RESOURCE_VIEW_DESC untuk menunjukkan bahwa SRV adalah tampilan mentah.
- Untuk membuat tampilan akses yang tidak diurutkan (UAV) ke buffer, panggil ID3D11Device::CreateUnorderedAccessView dengan bendera D3D11_BUFFER_UAV_FLAG_RAW. Anda menentukan bendera ini di anggota Bendera struktur D3D11_BUFFER_UAV . Anda mengatur D3D11_BUFFER_UAV di anggota Buffer dari struktur D3D11_UNORDERED_ACCESS_VIEW_DESC tempat parameter pDescID3D11Device::CreateUnorderedAccessView menunjuk. Anda juga mengatur nilai D3D11_UAV_DIMENSION_BUFFER di anggota ViewDimensionD3D11_UNORDERED_ACCESS_VIEW_DESC untuk menunjukkan bahwa UAV adalah tampilan mentah.
Anda dapat menggunakan jenis objek HLSL ByteAddressBuffer dan RWByteAddressBuffer saat Anda bekerja dengan buffer mentah.
Untuk membuat tampilan mentah ke buffer, Anda harus terlebih dahulu memanggil ID3D11Device::CreateBuffer dengan bendera D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS untuk membuat sumber daya buffer yang mendasar. Anda menentukan bendera ini di anggota MiscFlags dari struktur D3D11_BUFFER_DESC tempat parameter pDescID3D11Device::CreateBuffer menunjuk. Anda tidak dapat menggabungkan bendera D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS dengan D3D11_RESOURCE_MISC_BUFFER_STRUCTURED. Selain itu, jika Anda menentukan D3D11_BIND_CONSTANT_BUFFER di BindFlags of D3D11_BUFFER_DESC, Anda juga tidak dapat menentukan D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS di MiscFlags. Ini bukan batasan hanya tampilan mentah karena buffer konstan sudah memiliki batasan bahwa mereka tidak dapat dikombinasikan dengan tampilan lain.
Selain kasus yang tidak valid sebelumnya, saat Anda membuat buffer dengan D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, Anda tidak terbatas pada fungsionalitas versus tidak mengatur D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS. Artinya, Anda dapat menggunakan buffer seperti itu untuk akses non-mentah dengan sejumlah cara yang dimungkinkan dengan Direct3D. Jika Anda menentukan bendera D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS , Anda hanya meningkatkan fungsionalitas yang tersedia.
Topik terkait