Viewports dan kliping

Viewport adalah persegi panjang dua dimensi (2D) tempat adegan 3D diproyeksikan. Di Direct3D, persegi panjang ada sebagai koordinat dalam permukaan Direct3D yang digunakan sistem sebagai target penyajian. Transformasi proyeksi mengonversi simpul menjadi sistem koordinat yang digunakan untuk viewport. Viewport juga digunakan untuk menentukan rentang nilai kedalaman pada permukaan target render tempat adegan akan dirender (biasanya 0,0 hingga 1,0).

Frustum Penayangan

Frustum tampilan adalah volume 3D dalam adegan yang diposisikan relatif terhadap kamera viewport. Bentuk volume memengaruhi bagaimana model diproyeksikan dari ruang kamera ke layar. Jenis proyeksi yang paling umum, proyeksi perspektif, bertanggung jawab untuk membuat objek di dekat kamera tampak lebih besar dari objek di kejauhan. Untuk tampilan perspektif, frustum tampilan dapat divisualisasikan sebagai piramida, dengan kamera diposisikan di ujung seperti yang ditunjukkan pada ilustrasi berikut. Piramida ini berpotongan oleh bidang kliping depan dan belakang. Volume dalam piramida antara bidang kliping depan dan belakang adalah frustum tampilan. Objek hanya terlihat ketika objek berada dalam volume ini.

illustration of a viewing frustrum with a front and back clipping plan

Jika Anda membayangkan bahwa Anda berdiri di ruangan gelap dan melihat melalui jendela persegi, Anda memvisualisasikan frustum menonton. Dalam analogi ini, bidang kliping dekat adalah jendela, dan bidang kliping belakang adalah apa pun yang akhirnya mengganggu pandangan Anda - gedung pencakup langit di seberang jalan, pegunungan di kejauhan, atau tidak sama sekali. Anda dapat melihat semua yang ada di dalam piramida terpotok yang dimulai dari jendela dan diakhiri dengan apa pun yang mengganggu pandangan Anda, dan Anda tidak dapat melihat apa pun yang lain.

Frustum tampilan didefinisikan oleh fov (bidang pandang) dan oleh jarak bidang kliping depan dan belakang, ditentukan dalam koordinat z, seperti yang ditunjukkan dalam diagram berikut.

diagram of the viewing frustum

Dalam diagram ini, variabel D adalah jarak dari kamera ke asal ruang yang ditentukan di bagian terakhir dari alur geometri - transformasi tampilan. Ini adalah ruang di mana Anda mengatur batas frustum tampilan Anda. Untuk informasi tentang bagaimana variabel D ini digunakan untuk membangun matriks proyeksi, lihat transformasi Proyeksi

Persegi Panjang Viewport

Struktur viewport berisi empat anggota (X, Y, Lebar, Tinggi) yang menentukan area permukaan target render tempat adegan akan dirender. Nilai-nilai ini sesuai dengan persegi panjang tujuan, atau persegi panjang viewport, seperti yang diperlihatkan dalam diagram berikut.

diagram of the viewport rectangle

Nilai yang Anda tentukan untuk anggota X, Y, Lebar, Tinggi adalah koordinat layar relatif terhadap sudut kiri atas permukaan target render. Struktur mendefinisikan dua anggota tambahan (MinZ dan MaxZ) yang menunjukkan rentang kedalaman tempat adegan akan dirender.

Direct3D mengasumsikan bahwa volume kliping viewport berkisar dari -1.0 hingga 1.0 di X, dan dari 1.0 hingga -1.0 dalam Y. Ini adalah pengaturan yang paling sering digunakan oleh aplikasi di masa lalu. Anda dapat menyesuaikan rasio aspek viewport sebelum mengklip menggunakan transformasi proyeksi.

Catatan MinZ dan MaxZ menunjukkan rentang kedalaman tempat adegan akan dirender dan tidak digunakan untuk kliping. Sebagian besar aplikasi akan mengatur nilai-nilai ini ke 0,0 dan 1,0, untuk memungkinkan sistem merender ke seluruh rentang nilai kedalaman di buffer kedalaman. Dalam beberapa kasus, Anda dapat mencapai efek khusus dengan menggunakan rentang kedalaman lainnya. Misalnya, untuk merender tampilan heads-up dalam game, Anda dapat mengatur kedua nilai ke 0,0 untuk memaksa sistem merender objek dalam adegan di latar depan, atau Anda dapat mengatur keduanya ke 1,0 untuk merender objek yang harus selalu berada di latar belakang.

 

Dimensi yang digunakan dalam anggota X, Y, Width, Height dari struct viewport menentukan lokasi dan dimensi viewport pada permukaan render-target. Nilai-nilai ini berada di koordinat layar, relatif terhadap sudut kiri atas permukaan.

Direct3D menggunakan lokasi dan dimensi viewport untuk menskalakan simpul agar sesuai dengan adegan yang dirender ke lokasi yang sesuai pada permukaan target. Secara internal, Direct3D menyisipkan nilai-nilai ini ke dalam matriks berikut yang diterapkan ke setiap puncak.

equation of the matrix that is applied to each vertex

Matriks ini menskalakan simpul sesuai dengan dimensi viewport dan rentang kedalaman yang diinginkan dan menerjemahkannya ke lokasi yang sesuai pada permukaan target render. Matriks juga membalik koordinat y untuk mencerminkan asal layar di sudut kiri atas dengan y meningkat ke bawah. Setelah matriks ini diterapkan, simpul masih homogen - yaitu, mereka masih ada sebagai simpul [x,y,z,w] - dan harus dikonversi ke koordinat non-homogen sebelum dikirim ke rasterizer.

Catatan Aplikasi biasanya mengatur MinZ dan MaxZ masing-masing ke 0.0 dan 1.0 untuk menyebabkan sistem merender ke seluruh rentang kedalaman. Namun, Anda dapat menggunakan nilai lain untuk mencapai pengaruh tertentu. Misalnya, Anda dapat mengatur kedua nilai ke 0,0 untuk memaksa semua objek ke latar depan, atau mengatur keduanya ke 1,0 untuk merender semua objek ke latar belakang.

 

Menghapus Viewport

Menghapus viewport mereset konten persegi panjang viewport pada permukaan render-target. Ini juga dapat membersihkan persegi panjang di permukaan buffer kedalaman dan stensil.

Menyiapkan Viewport untuk Kliping

Hasil matriks proyeksi menentukan volume kliping dalam ruang proyeksi sebagai:

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

Di mana: x, y, z, dan w mewakili koordinat puncak setelah transformasi proyeksi diterapkan. Setiap simpul yang memiliki x-, y-, atau z-component di luar rentang ini diklip, jika kliping diaktifkan (perilaku default).

Sistem koordinat dan geometri