Peta normals vs normal

17

Saya menggunakan importir aset Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) untuk mem-parsing model 3d.

Sejauh ini, saya hanya mengeluarkan vektor normal yang ditentukan untuk setiap simpul di jerat saya. Namun saya juga menemukan berbagai tutorial di peta normal ...

Seperti yang saya pahami untuk peta normal, vektor normal disimpan di setiap texel dari peta normal, dan Anda menarik ini dari tekstur normal di shader.

Mengapa ada dua cara untuk mendapatkan norma, mana yang dianggap praktik terbaik dan mengapa?

KaiserJohaan
sumber

Jawaban:

31

Jawaban singkat

Peta normal dan Normal adalah dua hal yang berbeda: Normal adalah properti geometris dari setiap mesh / permukaan penggunaannya tidak eksklusif untuk perhitungan bayangan dan pencahayaan tetapi sebenarnya memiliki banyak kegunaan lain misalnya dalam fisika. Peta normal adalah tekstur yang menyandikan vektor normal alternatif yang digunakan dalam grafik komputer untuk mensimulasikan benjolan.

Jawaban panjang

Normalnya dalam geometri, normal adalah vektor atau garis yang tegak lurus terhadap objek tertentu (misalnya bidang normal, simpul normal). Normalnya dalam grafik biasanya digunakan untuk perhitungan cahaya, seperti menghitung refleksi difus melintasi permukaan dengan mengambil produk titik antara arah cahaya dan normal permukaan. Normalnya biasanya dihitung berdasarkan sifat geometris mesh (Wajah / Verteks), dengan mengambil produk silang dari setiap dua tepi non-paralel yang terletak pada bidang yang sama.

Dalam OpenGL normals ditentukan per vertex (karenanya disebut atribut vertex) meskipun mereka mungkin dihitung hanya untuk setiap wajah dalam hal ini Anda perlu menentukan normal yang sama untuk setiap vertex dalam wajah. Normalnya dapat diinterpolasi oleh OpenGL di setiap sudut wajah (segitiga) sehingga Anda dapat menghitung cahaya yang dipantulkan per piksel bukan per titik, sehingga memberikan hasil yang lebih akurat .

Pemetaan Normal : di sisi lain adalah teknik dalam grafik komputer yang mengkodekan Normals dalam peta tekstur, sehingga setiap normal dikodekan per texel. Biasanya digunakan untuk memalsukan pencahayaan benjolan dan penyok (misalnya pemetaan benjolan, pemetaan paralaks).

Karena normals dihitung berdasarkan sifat geometris dari mesh / permukaan, Normal Maps akan memberi Anda Normals alternatif yang dapat mensimulasikan benjolan untuk menambahkan detail ke permukaan tanpa menambahkan lebih banyak poligon.

Peta normal biasanya dihasilkan dengan menggunakan model 3D yang jauh lebih rinci, kemudian menghitung normalnya berdasarkan model ini dan menyandikannya dalam Peta Normal.

Mengapa kita membutuhkan keduanya?

Yah berbicara hanya tentang rendering, peta normal dan normal biasanya digunakan bersama untuk mencapai efek pencahayaan akhir, contoh yang baik mungkin bump shader, di mana Anda membutuhkan peta normal normal untuk mencapai efek pencahayaan bump, dan Anda masih akan memerlukan geometric normal untuk menghitung apa yang disebut ruang tangen . Ruang singgung biasanya digunakan untuk memberikan daya guna kembali untuk peta normal.

Perlu diingat bahwa yang normal dianggap sebagai atribut geometris permukaan dan memiliki lebih banyak kegunaan daripada hanya perhitungan cahaya. Peta normal di sisi lain biasanya digunakan untuk efek yang dangkal.

Memperluas jawaban untuk menjelaskan mengapa ruang singgung penting:

Jawaban singkat: Ruang singgung digunakan untuk membuat peta normal independen dari geometri yang mendasarinya.

[EDIT] Menambahkan Gambar untuk mewakili peta normal di ruang singgung dan peta normal di ruang dunia.

masukkan deskripsi gambar di sini

Jawaban panjang: Gambar di bawah ini menunjukkan bidang UV dan normal yang mendefinisikan ruang singgung, ketika menghasilkan peta normal kita sudah tahu bahwa ruang yang digunakan akan selalu memiliki Normal menunjuk ke arah Z (itu sebabnya peta normal terlihat kebiru-biruan) , ini akan membantu kami mengabaikan kelengkungan permukaan **,.

Ruang singgung memberi kita keuntungan bahwa pengkodean peta normal kita tidak terikat pada normals mesh tertentu. Misalkan kita menyandikan peta normal kita di dunia atau ruang objek, maka setiap normal yang kita enkode akan memiliki arah berdasarkan bagaimana normalnya mesh asli bervariasi dalam ruang dunia, belum lagi peta normal Anda akan dipengaruhi oleh transformasi model.

masukkan deskripsi gambar di sini

Dalam dua gambar di atas cukup jelas bahwa ruang singgung membuat peta normal (kanan), tidak tergantung pada geometri yang mendasarinya karena semua normalnya dikodekan dalam arah yang hampir sama dengan variasi kecil untuk mensimulasikan efek gundukan.

** kelengkungan permukaan didefinisikan oleh jumlah yang objek geometrik menyimpang dari menjadi datar, atau lurus dalam kasus garis tetapi ini didefinisikan dengan cara yang berbeda tergantung pada konteksnya.

Representasi ruang tangen

concept3d
sumber
1
Jika Anda dapat menemukan gambar yang menggambarkan bagaimana tekstur normal saja tidak dapat digunakan secara konsisten tanpa bidang normal dan garis singgung yang ditentukan berdasarkan per-dhuwur, Anda akan membuat ini jawaban terbaik pada masalah membingungkan ini untuk sebagian besar programmer grafis pemula!
teodron
Jawaban yang bagus tetapi normal tidak diinterpolasi oleh OpenGL di setiap wajah. Anda harus melakukannya sendiri dan memberikan normal interpolasi ke OpenGL (atau ke kode shader Anda).
Anastasios G
1
@AnastasiosG Saya pikir dia berbicara tentang perilaku default dari berbagai data karena akan diinterpolasi melintasi sebuah segitiga setiap kali sebuah fragmen dihitung untuk primitif tertentu. Saya tahu ada flag yang bisa Anda gunakan untuk memberi tahu OpenGL untuk menggunakan satu normal spesifik dari kemungkinan 3 vertex normals of triangle, tapi itu bukan perilaku default seperti yang saya ketahui.
teodron
1
@AnastasiosG Saya pikir detail seperti itu tidak akan memberikan jawaban apa pun karena ini bukan tentang cara menggunakan OpenGL. Tetapi jika itu membantu, di era saluran pipa tetap Anda membutuhkan glShadeModel (GL_SMOOTH) agar dapat memberitahu openGL untuk melakukan interpolasi. Di era pipeline yang dapat diprogram Anda mendefinisikan variabel sebagai bervariasi atau masuk / keluar dalam shader sehingga OpenGL dapat diinterpolasi.
concept3d
Saya ingin menambahkan bahwa peta benjolan hanyalah (geometris) normal yang dinaikkan / diturunkan berdasarkan tekstur hitam dan putih. :)
Entalpi