เกณฑ์ปกติเทียบกับแผนที่ปกติ


17

ฉันใช้ผู้นำเข้าสินทรัพย์ Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) เพื่อแยกวิเคราะห์โมเดล 3 มิติ

จนถึงตอนนี้ฉันก็แค่ดึงเวกเตอร์ปกติที่กำหนดไว้สำหรับแต่ละจุดยอดในตาข่ายของฉัน แต่ฉันก็ได้พบบทเรียนมากมายในแผนที่ปกติ ...

เมื่อฉันเข้าใจมันสำหรับแผนที่ปกติเวกเตอร์ปกติจะถูกเก็บไว้ในแต่ละเท็กเซลของแผนที่ปกติและคุณดึงสิ่งเหล่านี้ออกจากพื้นผิวปกติใน shader

เหตุใดจึงมีสองวิธีในการรับบรรทัดฐานซึ่งเป็นวิธีปฏิบัติที่ดีที่สุดและทำไม

คำตอบ:


31

คำตอบสั้น ๆ

แผนที่ปกติและ Normals เป็นสองสิ่งที่แตกต่างกัน: Normals เป็นคุณสมบัติทางเรขาคณิตของตาข่าย / พื้นผิวใด ๆ การใช้งานนั้นไม่ได้ จำกัด เฉพาะการคำนวณการแรเงาและแสง แต่มีการใช้งานอื่น ๆ มากมายเช่นในฟิสิกส์ แผนที่ปกติเป็นพื้นผิวที่เข้ารหัสเวกเตอร์ปกติทางเลือกที่ใช้ในคอมพิวเตอร์กราฟิกส์เพื่อจำลองการกระแทก

คำตอบยาว

เกณฑ์ปกติในเรขาคณิตปกติคือเวกเตอร์หรือเส้นที่ตั้งฉากกับวัตถุที่กำหนด (เช่นระนาบปกติ, จุดยอดปกติ) เกณฑ์ปกติในกราฟิกมักใช้สำหรับการคำนวณแสงเช่นการคำนวณการสะท้อนแบบกระจายบนพื้นผิวโดยการนำผลิตภัณฑ์แบบจุดระหว่างทิศทางแสงและพื้นผิวมาตรฐาน ปกติการคำนวณโดยทั่วไปจะขึ้นอยู่กับคุณสมบัติเชิงเรขาคณิตของตาข่าย (ใบหน้า / จุดยอด) โดยการหาครอสโปรดัคของสองขอบที่ไม่ขนานกันซึ่งอยู่บนระนาบเดียวกัน

ในบรรทัดฐาน OpenGL นั้นมีการระบุต่อจุดสุดยอด (เรียกว่าคุณลักษณะจุดสุดยอด) แม้ว่าพวกเขาอาจคำนวณเฉพาะสำหรับแต่ละใบหน้าในกรณีนี้คุณจะต้องระบุมาตรฐานเดียวกันสำหรับแต่ละจุดยอดในหน้า เกณฑ์ปกติสามารถแก้ไขได้ด้วย OpenGL ในแต่ละจุดยอดของใบหน้า (สามเหลี่ยม) เพื่อให้คุณสามารถคำนวณแสงสะท้อนต่อพิกเซลไม่ได้ต่อจุดยอดดังนั้นจึงให้ผลลัพธ์ที่แม่นยำยิ่งขึ้น

Normal Mapping : ในอีกทางหนึ่งเป็นเทคนิคในคอมพิวเตอร์กราฟิกส์ที่เข้ารหัส Normals ในแผนที่พื้นผิวดังนั้นแต่ละปกติจะถูกเข้ารหัสต่อ texel มันมักจะใช้สำหรับแกล้งแสงของการกระแทกและรอยบุบ (เช่นการทำแผนที่ Bump, การทำแผนที่ Parallax)

เนื่องจากการคำนวณเกณฑ์ปกตินั้นขึ้นอยู่กับคุณสมบัติเชิงเรขาคณิตของตาข่าย / พื้นผิวแผนที่ปกติจะให้เกณฑ์ปกติทางเลือกแก่คุณซึ่งสามารถจำลองการกระแทกเพื่อเพิ่มรายละเอียดให้กับพื้นผิวโดยไม่ต้องเพิ่มรูปหลายเหลี่ยมมากขึ้น

โดยปกติแผนที่ปกติจะสร้างขึ้นโดยใช้แบบจำลอง 3 มิติที่มีรายละเอียดมากขึ้นจากนั้นทำการคำนวณเกณฑ์ปกติโดยใช้โมเดลนี้และเข้ารหัสในแผนที่ปกติ

ทำไมเราต้องการทั้งสองอย่าง

ปกติแล้วการพูดคุยเกี่ยวกับการเรนเดอร์ปกติและแผนที่ปกติจะใช้ร่วมกันเพื่อให้ได้เอฟเฟกต์แสงสุดท้ายตัวอย่างที่ดีอาจเป็น bump shader ซึ่งคุณต้องการแผนที่ norm ปกติเพื่อให้ได้เอฟเฟกต์แสงกระแทกและคุณจะต้อง เรขาคณิตปกติที่จะคำนวณสิ่งที่เรียกว่าพื้นที่สัมผัส พื้นที่สัมผัสมักใช้เพื่อให้สามารถใช้งานได้กับแผนที่ปกติอีกครั้ง

โปรดทราบว่าปกติถือว่าเป็นคุณลักษณะทางเรขาคณิตของพื้นผิวและมีประโยชน์มากกว่าการคำนวณแบบเบาเท่านั้น แผนที่ปกติในทางกลับกันมักจะใช้สำหรับเอฟเฟกต์ผิวเผิน

การขยายคำตอบเพื่ออธิบายว่าทำไมช่องว่างแทนเจนต์จึงมีความสำคัญ:

คำตอบสั้น ๆ : มีการใช้ช่องว่างแทนเจนต์เพื่อทำให้แผนที่ปกติเป็นอิสระจากเรขาคณิตพื้นฐาน

[แก้ไข] เพิ่มรูปภาพเพื่อแสดงแผนที่ปกติในพื้นที่แทนเจนต์และแผนที่ปกติในอวกาศโลก

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบยาว: ภาพด้านล่างแสดงระนาบ UV และปกติที่กำหนดพื้นที่แทนเจนต์เมื่อสร้างแผนที่ปกติเราจะรู้แล้วว่าพื้นที่ที่ใช้มักจะมีการชี้ปกติในทิศทาง Z (นั่นคือสาเหตุที่แผนที่ปกติดูสีน้ำเงิน) สิ่งนี้จะช่วยให้เราเพิกเฉยต่อความโค้งของพื้นผิว **

พื้นที่สัมผัสช่วยให้เราได้เปรียบที่การเข้ารหัสแผนที่ปกติของเราไม่ได้ถูกผูกไว้กับมาตรฐานตาข่ายเฉพาะ สมมติว่าเราเข้ารหัสแผนที่ปกติของเราในโลกหรือพื้นที่วัตถุจากนั้นแต่ละปกติเราเข้ารหัสจะมีทิศทางขึ้นอยู่กับวิธีการดั้งเดิมตาข่ายตาข่ายแตกต่างกันไปในอวกาศโลกไม่พูดถึงแผนที่ปกติของคุณจะได้รับผลกระทบจากการเปลี่ยนแปลงรูปแบบ

ป้อนคำอธิบายรูปภาพที่นี่

ในภาพทั้งสองข้างต้นค่อนข้างชัดเจนว่าพื้นที่แทนเจนต์ทำให้แผนที่ปกติ (ขวา) เป็นอิสระจากเรขาคณิตพื้นฐานเพราะบรรทัดฐานทั้งหมดถูกเข้ารหัสในทิศทางเดียวกันเกือบทุกรูปแบบโดยมีการเปลี่ยนแปลงเล็กน้อยเพื่อจำลองผลกระทบของการกระแทก

** ความโค้งของพื้นผิวถูกกำหนดโดยจำนวนที่วัตถุทางเรขาคณิตเบี่ยงเบนจากการแบนหรือตรงในกรณีของเส้น แต่สิ่งนี้ถูกกำหนดในรูปแบบที่แตกต่างกันขึ้นอยู่กับบริบท

การแทนพื้นที่สัมผัสกัน


1
หากคุณสามารถค้นหาภาพที่แสดงให้เห็นว่าพื้นผิวปกติเพียงอย่างเดียวไม่สามารถใช้งานได้อย่างต่อเนื่องโดยไม่มีฟิลด์ปกติและแทนเจนต์ที่กำหนดตามจุดสุดยอดต่อคุณจะทำให้คำตอบนี้เป็นคำตอบที่ดีที่สุดสำหรับโปรแกรมเมอร์กราฟิกมือใหม่!
teodron

คำตอบที่ดี แต่บรรทัดฐานไม่ได้ถูกแก้ไขโดย OpenGL ในแต่ละหน้า คุณต้องทำด้วยตัวเองแล้วส่ง interpolated ปกติไปที่ OpenGL (หรือรหัส shader ของคุณ)
Anastasios G

1
@AnastasiosG ฉันคิดว่าเขากำลังพูดถึงพฤติกรรมเริ่มต้นของข้อมูลที่แตกต่างกันเนื่องจากได้รับการสอดแทรกข้ามรูปสามเหลี่ยมทุกครั้งที่มีการคำนวณส่วนย่อยสำหรับแบบดั้งเดิม ฉันรู้ว่ามีการตั้งค่าสถานะที่คุณสามารถใช้เพื่อบอก OpenGL ให้ใช้หนึ่งปกติออกมาจาก 3 ยอดปกติบรรทัดฐานของรูปสามเหลี่ยมที่เป็นไปได้ แต่นั่นไม่ใช่พฤติกรรมเริ่มต้นที่ฉันรู้
teodron

1
@AnastasiosG ฉันคิดว่ารายละเอียดดังกล่าวจะไม่ตอบสนองต่อความโปรดปรานใด ๆ เนื่องจากนี่ไม่เกี่ยวกับวิธีการใช้ OpenGL แต่ถ้าเป็นเช่นนั้นในยุคไปป์ไลน์คงที่คุณต้องมี glShadeModel (GL_SMOOTH) inorder เพื่อบอก openGL ให้แก้ไข ในยุคไปป์ไลน์ที่ตั้งโปรแกรมได้คุณจะกำหนดตัวแปรตามความแตกต่างหรือเข้า / ออกใน shader เพื่อให้ OpenGL สามารถแก้ไข
concept3d

ฉันต้องการเพิ่มว่าแผนที่ชนเป็นแบบธรรมดา (ทางเรขาคณิต) ที่ยกขึ้น / ลดลงตามพื้นผิวสีดำและสีขาว :)
Entalpi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.