Pemetaan Perpindahan (Direct3D 9)

Peta perpindahan mirip dengan peta tekstur tetapi diakses oleh mesin vertex.

Diagram Blok

Tahap sampler tambahan ada di bagian awal pipa vertex, seperti yang ditunjukkan dalam diagram berikut, yang dapat mengambil sampel peta perpindahan untuk menyediakan data pemindahan vertex.

diagram tahap sampler dalam pipa puncak

Status sampler peta perpindahan dapat diatur oleh SetSamplerState menggunakan nomor tahap 256, yang merupakan nomor tahap baru. Tekstur peta perpindahan diatur oleh SetTexture.

Peta dapat dirutekan sebelumnya atau tidak, yang berarti bahwa peta dapat diurutkan dengan cara yang memungkinkan pencarian nilai perpindahan tanpa pemfilteran.

  • Peta perpindahan dianalogikan dengan peta tekstur tetapi diakses oleh mesin vertex.
  • Tahap sampler tambahan ada di bagian awal pipa vertex yang dapat mengambil sampel peta perpindahan. Tahap ini diakses oleh API SetSamplerState yang biasa tetapi nomor tahapnya adalah D3DDMAPSAMPLER = 256.
  • Status sampler peta displacement dapat diatur oleh SetSamplerState(D3DDMAPSAMPLER, ...) API.
  • Tekstur peta displacement diatur oleh API SetTexture(D3DDMAPSAMPLER, texture).
  • Peta dapat diambil sampelnya sebelumnya atau tidak. Ini berarti bahwa itu dapat diurutkan dengan cara tertentu yang memungkinkan pencarian nilai perpindahan tanpa pemfilteran.
  • Perubahan struktur deklarasi memungkinkan spesifikasi koordinat tekstur yang digunakan untuk mencari peta tekstur. Misalnya, Stream0, Offset, FLOAT2, LOOKUP, Displacement_value. Ini memberi tahu tesselator untuk menggunakan vektor float 2D di stream0 pada offset tertentu sebagai koordinat tekstur untuk mencari peta perpindahan dan mengaitkan semantik penggunaan Displacement_value dengannya. Deklarasi shader vertex akan berisi baris yang mirip dengan {dcl_texture0, v0} yang menunjukkan bahwa semantik texture0 akan dikaitkan dengan register input v0. Nilai perpindahan yang dicari disalin ke dalam register input v0.
  • Ada jenis pemetaan perpindahan khusus, ketika peta tekstur telah diambil sampelnya sebelumnya. Indeks berurutan dari simpul yang dihasilkan digunakan sebagai koordinat tekstur ke peta tekstur. Misalnya, 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Penggunaan, UsageIndex.
  • Output pencarian adalah 4 float.
  • Pemetaan perpindahan hanya didukung dengan N-patch.
  • Driver perlu mengabaikan D3DDMAPSAMPLER di SetTextureStageState jika mereka tidak menangani peta perpindahan.
  • mode filter D3DTEXF_ANISOTROPIC tidak didukung.
  • Saat D3DSAMP_MIPFILTER dalam sampler peta displacement tidak D3DTEXF_NONE, tingkat detail dihitung sebagai berikut (Perhatikan bahwa status tessellation adaptif digunakan meskipun D3DRS_ENABLEADAPTIVETESSELLATION FALSE): Tmax = status render D3DRS_MAXTESSELLATIONLEVEL
  • Tingkat tesselulasi komputasi Te untuk vertex Vi: (Xi, Yi, Zi) dengan cara yang sama seperti yang dijelaskan di bagian "Tessellation adaptif". Tingkat detail L = log2(Tmax) - log2 (Te).
  • Operasi pemfilteran dan pengambilan sampel tekstur mengikuti aturan yang sama dengan bias alur piksel (tingkat detail (LOD) diterapkan, dll.).
  • Tidak semua format dapat digunakan sebagai peta perpindahan tetapi hanya format yang mendukung D3DUSAGE_DMAP. Aplikasi dapat mengkuerinya dengan CheckDeviceFormat CheckDeviceFormat.
  • D3DUSAGE_DMAP harus ditentukan dalam CreateTexture untuk memberi tahu driver bahwa tekstur ini akan digunakan sebagai peta perpindahan.
  • D3DUSAGE_DMAP hanya dapat digunakan dengan tekstur. Ini tidak dapat digunakan dengan peta kubus atau volume.
  • Tekstur dan target render yang dibuat dengan D3DUSAGE_DMAP dapat diatur pada tahap sampler reguler dan sebagai target render.
  • Status render untuk mengatur mode pembungkusan untuk koordinat tekstur diabaikan dalam pemetaan perpindahan. Secara umum, tidak ada mode bungkus untuk mesin tessellator.
  • Sampler peta displacement memiliki perilaku yang identik dengan sampler tekstur piksel. Jika tekstur dengan kurang dari empat saluran (seperti R32f) dicari, nilai yang dicari masuk ke saluran yang sesuai dari register tujuan (register input shader vertex ditandai dengan semantik _sample), sementara saluran lain default ke (1, 1, 1). Saat mencari, D3DFMT_L8 akan disiarkan ke saluran R, G, B, dan default A ke 1. Rasterizer referensi memiliki detail implementasi lengkap.

Pemetaan Displacement Pra-Sampel

  • Status sampler baru diperkenalkan: D3DSAMP_DMAPOFFSET (DWORD) - offset (dalam simpul) dalam peta perpindahan pra-sampel.
  • Metode deklarasi baru diperkenalkan: D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • Tessellation adaptif harus dinonaktifkan.
  • Pengaturan filter tekstur diabaikan. Pengambilan sampel titik selesai. Filter tekstur mip diasumsikan D3DTEXF_NONE. Semua mode filter tekstur lainnya diasumsikan D3DTEXF_POINT.
  • Koordinat tekstur dihitung sebagai: U = (Indeks % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) di mana Indeks adalah indeks berurutan dari simpul yang dihasilkan ditambah TSS[D3DSAMP_DMAPOFFSET]. Indeks berurutan diatur ke nol pada awal setiap primitif dan ditingkatkan setelah vertex dihasilkan.

Ini adalah perubahan API yang mendukung pemetaan displacement.

  • Satu format saluran ditambahkan, D3DFMT_L16.
  • Bendera penggunaan baru, D3DUSAGE_DMAP.
  • Tahap tekstur khusus, digunakan untuk mengatur tekstur peta perpindahan, D3DDMAPSAMPLER.
  • Batas perangkat keras baru telah ditambahkan, D3DDEVCAPS2_DMAPNPATCH dan D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Lihat D3DDEVCAPS2.

Alur Vertex