Bagikan melalui


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 memberikan data perpindahan vertex.

diagram dari tahap penyampel di pipa vertex

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

Peta dapat mengalami pra-pengambilan sampel atau tidak, yang berarti peta dapat diurutkan dengan cara yang memungkinkan menemukan nilai perpindahan tanpa pemfilteran.

  • Peta perpindahan dianalogikan dengan peta tekstur tetapi diakses oleh mesin vertex.
  • Tahap pengambil sampel tambahan ada di bagian awal jalur vertex yang dapat memproses peta perpindahan. Tahap ini diakses oleh API SetSamplerState biasa tetapi nomor tahap D3DDMAPSAMPLER = 256.
  • Status sampler peta perpindahan dapat diatur oleh SetSamplerState(D3DDMAPSAMPLER, ...) API.
  • Tekstur peta perpindahan diatur oleh API SetTexture(D3DDMAPSAMPLER, tekstur).
  • Peta dapat disampel sebelumnya atau tidak. Ini berarti bahwa itu dapat diurutkan dengan cara tertentu yang memungkinkan pencarian nilai perpindahan tanpa pemfilteran.
  • Perubahan dalam 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 dalam stream0 pada offset tertentu sebagai koordinat tekstur untuk mencari peta perpindahan dan mengaitkan semantik penggunaan Displacement_value ke dalamnya. 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 sudah diambil sampelnya. Indeks berurutan dari simpul yang dihasilkan digunakan sebagai koordinat tekstur ke peta tekstur. Misalnya, 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Penggunaan, IndeksPenggunaan.
  • Hasil penelusuran adalah 4 float.
  • Pemetaan perpindahan hanya didukung dengan N-patch.
  • Para driver perlu mengabaikan D3DDMAPSAMPLER di SetTextureStageState jika mereka tidak menangani peta perpindahan.
  • Modus penyaringan D3DTEXF_ANISOTROPIC tidak didukung.
  • Ketika D3DSAMP_MIPFILTER dalam sampel peta perpindahan tidak D3DTEXF_NONE, tingkat detail dihitung sebagai berikut (Perhatikan bahwa status tesselulasi adaptif digunakan bahkan jika D3DRS_ENABLEADAPTIVETESSELLATION FALSE): Tmax = status render D3DRS_MAXTESSELLATIONLEVEL
  • Menghitung tingkat tesselasi Te untuk vertex Vi: (Xi, Yi, Zi) dengan cara yang sama seperti yang dijelaskan di bagian "Tesselasi Adaptif". Tingkat detail L = log2(Tmax) - log2 (Te).
  • Operasi pemfilteran dan pengambilan sampel tekstur mengikuti aturan yang sama seperti alur pemrosesan piksel (bias tingkat detail (LOD) diterapkan, dan sebagainya).
  • 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 dalamCreateTextureuntuk 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.
  • Pengaturan render untuk menentukan mode pembungkusan untuk koordinat tekstur diabaikan dalam pemetaan displacement. Secara umum, tidak ada mode bungkus untuk mesin tessellator.
  • Sampel peta perpindahan memiliki perilaku yang identik dengan sampel tekstur piksel. Jika tekstur dengan kurang dari empat saluran (seperti R32f) diakses, nilai yang diperoleh masuk ke saluran yang sesuai dari register tujuan (register input shader vertex yang ditandai dengan semantik _sample), sementara saluran lainnya secara default menjadi (1, 1, 1). Ketika dicari, D3DFMT_L8 akan diteruskan ke saluran R, G, B, dan A secara default diatur ke 1. Rasterizer referensi memiliki detail implementasi lengkap.

Pemetaan Perpindahan Pra-Sampel

  • Keadaan sampler baru diperkenalkan: D3DSAMP_DMAPOFFSET (DWORD) - offset (dalam vertex) dalam peta perpindahan yang telah diambil sampelnya sebelumnya.
  • Metode deklarasi baru diperkenalkan: D3DDECLMETHOD_LOOKUPPRESAMPLED.
  • Tessellation adaptif harus dinonaktifkan.
  • Pengaturan filter tekstur diabaikan. Pengambilan sampel titik selesai. Filter tekstur mip diasumsikan sebagai D3DTEXF_TIDAK ADA. Semua mode filter tekstur lainnya dianggap sebagai 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 perpindahan.

  • Format saluran tunggal ditambahkan, D3DFMT_L16.
  • Bendera penggunaan baru, D3DUSAGE_DMAP.
  • Tahap tekstur khusus yang digunakan untuk mengatur tekstur peta pemindahan, disebut D3DDMAPSAMPLER.
  • Batas perangkat keras baru telah ditambahkan, D3DDEVCAPS2_DMAPNPATCH, dan D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Lihat D3DDEVCAPS2.

Alur Vertex