Bagikan melalui


Vektor normal wajah dan puncak

Setiap wajah dalam jala memiliki unit vektor normal yang lurus. Arah vektor ditentukan oleh urutan di mana simpul didefinisikan dan oleh apakah sistem koordinat bertangan kanan atau kiri.

Vektor normal unit perpendiktif untuk wajah depan

Setiap wajah dalam jala memiliki unit vektor normal yang lurus. Arah vektor ditentukan oleh urutan di mana simpul didefinisikan dan oleh apakah sistem koordinat bertangan kanan atau kiri. Wajah normal menunjuk jauh dari sisi depan wajah. Di Direct3D, hanya bagian depan wajah yang terlihat. Wajah depan adalah salah satu di mana simpul didefinisikan dalam urutan searah jarang.

Ilustrasi berikut menunjukkan vektor normal untuk wajah depan:

vektor normal untuk wajah depan

Membungkukkan wajah belakang

Setiap wajah yang bukan wajah depan adalah wajah belakang. Direct3D tidak selalu merender wajah belakang; wajah belakang dikatakan dimusnahkan. Memusnahkan wajah belakang berarti menghilangkan wajah belakang dari penyajian. Anda dapat mengubah mode pemusnahan untuk merender kembali wajah jika anda mau. Lihat Status Culling untuk informasi selengkapnya.

Unit puncak normal

Direct3D menggunakan unit puncak normal untuk efek bayangan, pencahayaan, dan teksur Gouraud.

Ilustrasi berikut menunjukkan normal puncak:

vertex normal

Saat menerapkan bayangan Gouraud ke poligon, Direct3D menggunakan normal verteks untuk menghitung sudut antara sumber cahaya dan permukaan. Ini menghitung nilai warna dan intensitas untuk simpul dan menginterpolasinya untuk setiap titik di semua permukaan primitif. Direct3D menghitung nilai intensitas cahaya dengan menggunakan sudut. Semakin besar sudutnya, semakin sedikit cahaya yang bersinar di permukaan.

Permukaan datar

Jika Anda membuat objek yang datar, atur vertex normal untuk menunjuk ke permukaan.

Ilustrasi berikut menunjukkan permukaan datar yang terdiri dari dua segitiga dengan normal puncak:

permukaan datar terdiri dari dua segitiga dengan normal vertex

Bayangan halus pada objek non-datar

Daripada objek datar, lebih mungkin objek Anda terdiri dari strip segitiga dan segitiga bukan koplanar. Salah satu cara sederhana untuk mencapai bayangan halus di semua segitiga dalam strip adalah dengan terlebih dahulu menghitung vektor normal permukaan untuk setiap wajah poligonal yang terkait dengan vertex. Puncak normal dapat diatur untuk membuat sudut yang sama dengan setiap permukaan normal. Namun, metode ini mungkin tidak cukup efisien untuk primitif yang kompleks.

Metode ini diilustrasikan oleh diagram berikut, yang menunjukkan dua permukaan, S1 dan S2 terlihat edge-on dari atas. Vektor normal untuk S1 dan S2 ditampilkan dalam warna biru. Vektor normal puncak ditampilkan dengan warna merah. Sudut yang dilakukan vektor normal verteks dengan permukaan normal S1 sama dengan sudut antara vertex normal dan permukaan normal S2. Ketika kedua permukaan ini menyala dan berbayang dengan bayangan Gouraud, hasilnya adalah tepi yang berbayang halus dan bulat di antara mereka.

Ilustrasi berikut menunjukkan dua permukaan (S1 dan S2) dan vektor normal dan vektor normal verteksnya:

dua permukaan (s1 dan s2) dan vektor normal dan vektor normal verteksnya

Jika puncak normal condong ke salah satu wajah yang terkait dengannya, itu menyebabkan intensitas cahaya meningkat atau berkurang untuk titik-titik pada permukaan itu, tergantung pada sudut yang dihasilkannya dengan sumber cahaya. Diagram berikut menunjukkan contoh. Permukaan-permukaan ini terlihat edge-on. Vertex normal condong ke S1, menyebabkannya memiliki sudut yang lebih kecil dengan sumber cahaya daripada jika vertex normal memiliki sudut yang sama dengan permukaan normal.

Ilustrasi berikut menunjukkan dua permukaan (S1 dan S2) dengan vektor normal verteks yang condong ke satu wajah:

dua permukaan (s1 dan s2) dengan vektor normal verteks yang condong ke satu wajah

Tepi tajam

Anda dapat menggunakan bayangan Gouraud untuk menampilkan beberapa objek dalam adegan 3D dengan tepi tajam. Untuk melakukannya, duplikat vektor normal vertex di persimpangan wajah mana pun di mana tepi tajam diperlukan.

Ilustrasi berikut menunjukkan vektor normal vertex duplikat di tepi tajam:

vektor normal verteks duplikat di tepi tajam

Jika Anda menggunakan metode DrawPrimitive untuk merender adegan Anda, tentukan objek dengan tepi tajam sebagai daftar segitiga, bukan strip segitiga. Saat Anda mendefinisikan objek sebagai strip segitiga, Direct3D memperlakukannya sebagai poligon tunggal yang terdiri dari beberapa wajah segitiga. Gouraud shading diterapkan baik di setiap wajah poligon dan antara wajah yang berdekatan.

Hasilnya adalah objek yang dinaungi dengan lancar dari wajah ke wajah. Karena daftar segitiga adalah poligon yang terdiri dari serangkaian wajah segitiga yang terputus-putus, Direct3D menerapkan bayangan Gouraud di setiap wajah poligon. Namun, itu tidak diterapkan dari tatap muka. Jika dua atau beberapa segitiga dari daftar segitiga berdekatan, mereka tampaknya memiliki tepi tajam di antara mereka.

Alternatif lainnya adalah mengubah ke bayangan datar saat merender objek dengan tepi tajam. Ini secara komputasi metode yang paling efisien, tetapi dapat mengakibatkan objek dalam adegan yang tidak dirender secara realistis seperti objek yang berbayang Gouraud.

Sistem koordinat dan geometri