Bagikan melalui


Sprite Titik (Direct3D 9)

Dukungan untuk sprite titik di Direct3D 9 memungkinkan penyajian titik berkinerja tinggi (sistem partikel). Sprite titik adalah generalisasi titik generik yang memungkinkan bentuk arbitrer dirender seperti yang didefinisikan oleh tekstur.

Kontrol Penyajian Primitif Titik

Direct3D 9 mendukung parameter tambahan untuk mengontrol penyajian sprite titik (primitif titik). Parameter ini memungkinkan titik menjadi berukuran variabel dan memiliki peta tekstur lengkap yang diterapkan. Ukuran setiap titik ditentukan oleh ukuran yang ditentukan aplikasi yang dikombinasikan dengan fungsi berbasis jarak yang dihitung oleh Direct3D. Aplikasi dapat menentukan ukuran titik baik per puncak atau dengan mengatur D3DRS_POINTSIZE, yang berlaku untuk titik tanpa ukuran per puncak. Ukuran titik dinyatakan dalam unit ruang kamera, dengan pengecualian ketika aplikasi melewati simpul format vertex fleksibel (FVF) pasca-transformasi. Dalam hal ini, fungsi berbasis jarak tidak diterapkan dan ukuran titik dinyatakan dalam satuan piksel pada target render.

Tekstur mengoordinasikan komputasi dan digunakan saat merender titik tergantung pada pengaturan D3DRS_POINTSPRITEENABLE. Ketika nilai ini diatur ke TRUE, koordinat tekstur diatur sehingga setiap titik menampilkan tekstur lengkap. Secara umum, ini hanya berguna ketika titik secara signifikan lebih besar dari satu piksel. Saat D3DRS_POINTSPRITEENABLE diatur ke FALSE, koordinat tekstur puncak setiap titik digunakan untuk seluruh titik.

Komputasi Ukuran Titik

Ukuran titik ditentukan oleh D3DRS_POINTSCALEENABLE. Jika nilai ini diatur ke FALSE, ukuran titik yang ditentukan aplikasi digunakan sebagai ukuran ruang layar (pasca-transformasi). Simpul yang diteruskan ke Direct3D di ruang layar tidak memiliki ukuran titik yang dihitung; ukuran titik yang ditentukan ditafsirkan sebagai ukuran spasi layar.

Jika D3DRS_POINTSCALEENABLE TRUE, Direct3D menghitung ukuran titik spasi layar sesuai dengan rumus berikut. Ukuran titik yang ditentukan aplikasi dinyatakan dalam unit ruang kamera.

S = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² )))

Dalam rumus ini, ukuran titik input, S i, adalah per-vertex atau nilai status render D3DRS_POINTSIZE. Faktor skala titik, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B, dan D3DRS_POINTSCALE_C, diwakili oleh titik A, B, dan C. Tinggi viewport, V h, adalah anggota Tinggi struktur D3DVIEWPORT9 yang mewakili viewport. D ₑ, jarak dari mata ke posisi (mata di asal), dihitung dengan mengambil posisi ruang mata titik (Xₑ, Yₑ, Zₑ) dan melakukan operasi berikut.

D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)

Ukuran titik maksimum, Pmₐₓ, ditentukan dengan mengambil yang lebih kecil dari anggota MaxPointSize struktur D3DCAPS9 atau status render D3DRS_POINTSIZE_MAX. Ukuran titik minimum, Pmin, ditentukan dengan mengkueri nilai D3DRS_POINTSIZE_MIN. Dengan demikian ukuran titik ruang layar akhir, S, ditentukan dengan cara berikut.

  • Jika Ss > Pmₐₓ, maka S = P mₐₓ
  • jika S < Pmin, maka S = P min
  • Jika tidak, S = S s

Penyajian Titik

Titik spasi layar, P = ( X, Y, Z, W), dari ukuran ruang layar S dirasterisasi sebagai quadrilateral dari empat simpul berikut.

(( X + S/2, Y + S/2, Z, W), ( X + S/2, Y - S/2, Z, W), ( X - S/2, Y- S/2, Z, W), ( X - S/2, Y + S/2, Z, W))

Atribut warna puncak diduplikasi di setiap puncak; dengan demikian setiap titik selalu dirender dengan warna konstan.

Penetapan indeks tekstur dikendalikan oleh pengaturan status render D3DRS_POINTSPRITEENABLE. Jika D3DRS_POINTSPRITEENABLE diatur ke FALSE, maka koordinat tekstur puncak diduplikasi di setiap puncak. Jika D3DRS_POINTSPRITEENABLE diatur ke TRUE, maka koordinat tekstur pada empat simpul diatur ke nilai berikut.

(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)

Ini diperlihatkan dalam diagram berikut.

diagram persegi dengan simpul berlabel untuk nilai koordinat (u,v) dan (x,y)

Saat kliping diaktifkan, titik dipotong dengan cara berikut. Jika vertex melebihi rentang nilai kedalaman - MinZ dan MaxZ dari struktur D3DVIEWPORT9 - tempat adegan akan dirender, titiknya ada di luar frustum tampilan dan tidak dirender. Jika poinnya, dengan mempertimbangkan ukuran titik, benar-benar berada di luar viewport di X dan Y, maka titik tidak dirender; poin yang tersisa dirender. Dimungkinkan bagi posisi titik berada di luar viewport di X atau Y dan masih terlihat sebagian.

Titik mungkin atau mungkin tidak diklip dengan benar ke clip plane yang ditentukan pengguna. Jika D3DPMISCCAPS_CLIPPLANESCALEDPOINTS tidak diatur dalam anggota PrimitiveMiscCaps struktur D3DCAPS9 , titik dipotong ke clip plane yang ditentukan pengguna hanya berdasarkan posisi puncak, mengabaikan ukuran titik. Dalam hal ini, titik yang diskalakan sepenuhnya dirender ketika posisi puncak berada di dalam clip plane, dan dibuang ketika posisi puncak berada di luar clip plane. Aplikasi dapat mencegah artefak potensial dengan menambahkan geometri batas ke clip plane yang sebesar ukuran titik maksimum.

Jika bit D3DPMISCCAPS_CLIPPLANESCALEDPOINTS diatur, maka titik yang diskalakan dipotong dengan benar ke clip plane yang ditentukan pengguna.

Pemrosesan puncak perangkat keras mungkin atau mungkin tidak mendukung ukuran titik. Misalnya, jika perangkat dibuat dengan D3DCREATE_HARDWARE_VERTEXPROCESSING pada perangkat lapisan abstraksi perangkat keras (HAL) (D3DDEVTYPE_HAL) yang memiliki anggota MaxPointSize struktur D3DCAPS9 yang diatur ke 1,0 atau 0,0, maka semua titik adalah satu piksel. Untuk merender sprite titik piksel kurang dari 1.0, Anda harus menggunakan simpul FVF TL (diubah dan menyala) atau pemrosesan vertex perangkat lunak (D3DCREATE_SOFTWARE_VERTEXPROCESSING), dalam hal ini waktu proses Direct3D meniru penyajian sprite titik.

Perangkat keras yang memproses vertex dan mendukung sprite titik - MaxPointSize diatur ke lebih besar dari 1,0f - diperlukan untuk melakukan komputasi ukuran untuk sprite yang tidak ditransformasi dan diperlukan untuk mengatur per vertex atau D3DRS_POINTSIZED3DRS_POINTSIZE dengan benar untuk simpul TL.

Untuk informasi tentang aturan penyajian untuk titik, garis, dan segitiga, lihat Aturan Rasterisasi (Direct3D 9).

Alur Vertex