Bagaimana cara pemetaan normal bekerja?

10

Saya mencoba memahami konsep pemetaan normal, tetapi saya bingung dengan beberapa hal. Singkatnya, saya tidak yakin apakah peta normal bergantung pada sudut pandang atau tidak (yaitu apakah Anda akan mendapatkan peta normal yang berbeda dari objek yang sama ketika Anda memutarnya). Kedua, saya tidak mengerti mengapa warna kebiruan adalah warna dominan di peta normal.

Bagaimana saya berpikir tentang normals, dan hubungannya dengan warna RGB, adalah sebagai berikut. Unit sphere mewakili setiap unit normal yang mungkin - dengan kata lain, komponen X, Y dan Z dari satuan vektor normal berkisar dari -1 hingga 1. Komponen warna RGB semuanya berkisar dari 0 hingga 255. Oleh karena itu, masuk akal untuk memetakan -1 (komponen normal) ke 0 (komponen warna), 0 hingga 127 atau 128, dan 1 hingga 255. Nilai apa pun di antaranya hanya diinterpolasi secara linier.

Menerapkan pemetaan ini ke normal objek 3D sewenang-wenang menghasilkan gambar yang sangat berwarna, sama sekali tidak didominasi biru. Misalnya, saat mengambil kubus, keenam wajah akan memiliki warna yang berbeda namun seragam. Misalnya, wajah dengan normal (1,0,0) akan menjadi (255,128,128), wajah dengan normal (0,0, -1) akan menjadi (128,128,0) dan seterusnya.

Namun, untuk beberapa alasan peta normal dari kubus yang saya temukan benar-benar kebiruan, yaitu (128.128.255). Namun yang jelas, normals tidak semuanya dalam arah z positif, yaitu (0,0,1). Bagaimana cara kerjanya?

[Sunting]

Ok, jadi pendekatan yang dijelaskan di atas tampaknya disebut sebagai objek peta normal ruang atau peta normal ruang dunia . Yang lainnya disebut peta normal ruang singgung . Saya mengerti bagaimana peta normal ruang singgung seperti itu dapat digunakan untuk memodifikasi normals dari suatu geometri, tetapi saya masih tidak sepenuhnya yakin bagaimana sebenarnya dihitung (lihat komentar saya di jawaban Nicol Bolas ').

[Sunting 2]

Saya mungkin harus menyebutkan bahwa saya bekerja dengan permukaan parametrik piecewise. Permukaan ini terdiri dari satu set tambalan permukaan , di mana setiap tambalan dikaitkan dengan ruang parametriknya sendiri (u, v) = [0,1] x [0,1]. Pada titik mana pun di permukaan, normal dapat dihitung dengan tepat. Rupanya, vektor T ( tangen ) dan B ( bi-tangen ) - diperlukan untuk span ruang tangen - bukan hanya turunan parsial dari patch permukaan ke arah u dan v ...

Ailurus
sumber
Pernahkah Anda mencoba menerapkan phong atau setidaknya peneduhan difus? Apakah Anda tahu rumus dasar seperti titik (a, b) = cos (sudut (a, b)) untuk vektor satuan a, b? Beberapa jam implementasi akan menyelamatkan Anda dari perjuangan bertahun-tahun.
Ivan Kuckir
@Ailurus: lihat komentar / jawaban saya tentang cara mendekati masalah yang sama untuk objek medan / bidang ketinggian. Memang sedikit lebih rumit untuk objek lain, tetapi konsepnya seharusnya tidak berbeda.
teodron
Kasus khusus pemetaan normal medan: gamedev.stackexchange.com/questions/43894/…
teodron

Jawaban:

14

Pemetaan tekstur adalah pemetaan antara titik pada permukaan 3D dan titik terkait pada gambar tekstur. Jika Anda memiliki pemetaan tekstur 1: 1, maka setiap titik pada permukaan 3D memetakan ke titik spesifik dan unik pada gambar tekstur (meskipun sebaliknya tidak perlu benar. Beberapa lokasi dalam tekstur tidak perlu memetakan ke lokasi di permukaan).

Dengan pemetaan seperti itu, Anda bisa melewati permukaan 3D dan menyimpan setiap normal yang berbeda di lokasi yang sesuai dalam tekstur.

OK baiklah, ayo lakukan itu. Kami akan pergi melalui permukaan 3D dan menghasilkan objek-ruang normals lokasi dipetakan, dan kemudian menempelkannya di tekstur. Jadi ketika kita ingin me-render, kita cukup mengambil objek-ruang normal dari tekstur dan kita selesai. Baik?

Ya, itu akan berhasil. Tetapi itu juga berarti bahwa normals tekstur hanya dapat digunakan dengan objek tertentu. Dan itu juga berarti bahwa normals tekstur hanya dapat digunakan dengan objek itu dan dengan pemetaan tekstur tertentu . Jadi jika Anda ingin memutar pemetaan tekstur dengan cara tertentu, atau mengubahnya dengan transformasi UV, Anda kurang beruntung.

Jadi secara umum, yang digunakan orang adalah peta normal di mana normals berada dalam "ruang singgung". Ruang-singgung adalah ruang relatif terhadap titik yang dipetakan pada permukaan 3D, di mana normal yang tidak dimodifikasi berada dalam arah + Z, dan sumbu X dan Y menunjuk sepanjang sumbu U dan V relatif terhadap permukaan.

Ruang singgung pada dasarnya mengatur normal. Dalam ruang singgung, normal (0, 0, 1) selalu berarti "tidak dimodifikasi"; itu normal yang Anda dapatkan dari interpolasi vertex normal. Ini mengarah ke sejumlah hal berguna yang dapat Anda lakukan , salah satu yang paling penting adalah menyimpannya dalam lebih sedikit data.

Karena Z akan selalu positif, karena itu Anda dapat menghitungnya di shader Anda dari komponen X dan Y. Karena Anda hanya membutuhkan 2 nilai, jadi Anda bisa menggunakan (dalam nomenklatur format gambar OpenGL ) GL_RG8, format 2-byte-per-piksel daripada GL_RGBA8, 4-byte-per-piksel ( GL_RGB8masih akan menjadi 4-byte-per-piksel , karena GPU akan mem-pad masing-masing pixel hingga 4 byte). Lebih baik lagi, Anda dapat memampatkan kedua nilai tersebut , yang mengarah ke format 1-byte-per-piksel. Jadi, Anda telah mengurangi ukuran tekstur hingga 75% dari peta normal objek-ruang.

Sebelum Anda dapat berbicara tentang segala jenis peta normal, Anda perlu tahu dulu apa yang disimpannya. Apakah itu peta normal objek-ruang, peta normal ruang-singgung, atau sesuatu yang lain?

Nicol Bolas
sumber
Baiklah, jadi tipe peta pertama yang Anda gambarkan adalah peta normal objek-ruang , kan? Ini lebih berwarna, karena menyimpan komponen X, Y dan Z yang asli dari normals. Tipe kedua, peta normal ruang singgung , tampaknya menyimpan sesuatu seperti gangguan pada normals daripada normals itu sendiri. Saya akan membaca konsep ruang singgung dan memeriksa kembali nanti.
Ailurus
Ok, jadi ruang singgung titik pada permukaan hanyalah ruang semua vektor singgung dari titik itu. Namun, dalam kasus itu saya tidak melihat bagaimana normal seperti yang terlihat dari ruang singgung bisa menjadi apa pun selain (0,0,1)? Dengan kata lain, saya akan selalu berharap peta normal menjadi seragam biru (128.128.255). Namun, contoh yang ditunjukkan pada halaman wikipedia ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) berisi warna lain. Saya mengerti bagaimana peta ini dapat digunakan untuk mengubah normals, tetapi tidak bagaimana sebenarnya dihitung.
Ailurus
@ Ailurus: " Ok, jadi ruang singgung titik pada permukaan hanyalah ruang semua vektor singgung dari titik itu. " Tidak, tidak. Ini adalah ruang yang ditentukan oleh normal (tidak dimodifikasi) dan arah tekstur koordinat pada titik itu di permukaan. Ini mengatur normal yang disimpan dalam tekstur sebagai relatif terhadap pemetaan tekstur dan normal saat ini sebelum modifikasi.
Nicol Bolas
Mungkin bagian yang paling sulit tentang peta normal adalah pemetaan itu sendiri (termasuk cara menghitung vektor garis singgung). Bukankah perhitungan vektor tangen secara intrinsik terkait dengan pemetaan UV / pembungkus tekstur difus DAN ke geometri objek sama sekali? Dengan kata lain: Anda memiliki dua peta normal berbeda untuk suatu objek, tetapi hanya satu bidang singgung (dan normal) yang dihitung. Anda mungkin menemukan bahwa Anda tidak dapat menggunakan bidang singgung secara konsisten dengan dua tekstur normal yang berbeda (walaupun secara geometris Anda dapat menemukan pemetaan uv yang cocok, yang bukan tugas sepele).
teodron
@NicolBolas Ah, saya bingung karena beberapa sumber mengklaim bahwa vektor T, B dan N membentuk basis ortonormal, sedangkan yang lain menyebutkan bahwa ini tidak selalu benar.
Ailurus
3

Peta normal dipetakan menggunakan apa yang disebut ruang singgung, yang pada dasarnya adalah ruang lokal berdasarkan tekstur-ruang model. Ini harus menjawab kedua pertanyaan Anda.

Ini tidak bergantung pada sudut pandang karena ruang ini tidak ada hubungannya dengan kamera. Dalam peta normal, Z adalah arah atas. Jika Anda melihat normals suatu model, sebagian besar vektor normal akan menunjuk langsung keluar dari jala. Permukaan mesh adalah ruang tekstur yang saya bicarakan, jadi dalam sistem koordinat lokal, naik adalah arah "luar".

menganiaya
sumber
Terima kasih telah menjelaskan ini! Namun, saya tidak menggunakan mesh poligonal sebagai permukaan, tetapi permukaan parametrik yang halus . Oleh karena itu, semua normals akan disimpan sebagai menunjuk ke arah (0,0,1), kan?
Ailurus
1

Gulir ke bawah di halaman ini

Lihatlah gambar kanan B / W di bawah dataset - ini (atau setidaknya dulu) dikenal sebagai gambar landak, rendering permukaan dengan masing-masing normalnya digambar

Jadi, untuk memahami peta normal tradisional, pikirkan landak kesal dengan semua duri mencuat - masing-masing duri itu normal ke permukaan landak di bawahnya -

Sehubungan dengan pertanyaan bola Anda, jika Anda hidup murni di ruang parametrik, seperti halnya dengan pelacak sinar, maka rangkaian normalnya yang tak terbatas pada bola hanya akan menciptakan bola yang lebih besar - di ruang tessellated, yaitu dunia yang ditekankan oleh komputer pada kita jika kami ingin waktu nyata, maka Anda memiliki perkiraan runcing dari bola.

Sekarang, contoh ini berfokus pada peta normal OBJECT - itu mendefinisikan normals sehubungan dengan objek, dan ini tidak berubah dalam rotasi, terjemahan, atau penskalaan apa pun - baik objek atau kamera atau apa pun - seperti yang disebutkan sebelumnya, ini adalah hanya satu jenis peta normal tapi itu yang paling umum

Mark Mullin
sumber
0

Saya pikir Anda mungkin memiliki beberapa kesalahpahaman tentang apa peta normal itu. Pada dasarnya, ini adalah cara mensimulasikan tampilan sesuatu yang bergelombang ketika kenyataannya geometri benar-benar datar.

Warna-warna peta normal ditafsirkan oleh shader teknologi dan diproses berdasarkan intensitas dan arah cahaya, serta tampilan kamera Anda. Ini berarti bahwa Anda dapat memiliki lantai bata misalnya, yang benar-benar datar, dengan tekstur datar, tetapi karena memiliki peta normal dengan bentuk batu bata yang sama, ketika Anda melihat di sekitarnya, cahaya akan tampak memantul ke samping. dari batu bata membuatnya terlihat lebih 3D daripada sebelumnya.

Ini tentu saja hanya ilusi, tetapi jauh lebih murah daripada memiliki geometri yang kompleks. Dan tidak, warna peta normal tidak berubah. Mereka benar-benar hanya mewakili nilai untuk dibandingkan dengan shader. Saya yakin seseorang di sini akan dapat mengisi Anda dengan lebih detail.

SirYakalot
sumber
Saya tahu, tapi terima kasih atas jawaban Anda :)
Ailurus