Bản đồ so với bản đồ thông thường


17

Tôi đang sử dụng trình nhập tài sản Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) để phân tích các mô hình 3d.

Cho đến nay, tôi chỉ đơn giản là rút ra các vectơ bình thường được xác định cho mỗi đỉnh trong các mắt lưới của mình. Tuy nhiên, tôi cũng đã tìm thấy nhiều hướng dẫn khác nhau trên bản đồ bình thường ...

Theo tôi hiểu đối với các bản đồ bình thường, các vectơ bình thường được lưu trữ trong mỗi texel của một bản đồ bình thường và bạn kéo chúng ra khỏi kết cấu bình thường trong trình đổ bóng.

Tại sao có hai cách để có được quy tắc, cách nào được coi là thực hành tốt nhất và tại sao?

Câu trả lời:


31

Câu trả lời ngắn

Bản đồ thông thường và Định mức là hai thứ khác nhau: Định mức là một thuộc tính hình học của bất kỳ lưới / bề mặt nào, việc sử dụng nó không dành riêng cho tính toán bóng và chiếu sáng nhưng thực sự có nhiều ứng dụng khác trong vật lý. Bản đồ bình thường là kết cấu mã hóa các vectơ bình thường thay thế được sử dụng trong đồ họa máy tính để mô phỏng các va chạm.

Câu trả lời dài

Định mức trong hình học bình thường là một vectơ hoặc đường thẳng vuông góc với một đối tượng nhất định (ví dụ: mặt phẳng bình thường, đỉnh bình thường). Các chỉ tiêu trong đồ họa thường được sử dụng để tính toán ánh sáng, chẳng hạn như tính toán Phản xạ khuếch tán trên một bề mặt bằng cách lấy sản phẩm chấm giữa hướng sáng và quy tắc bề mặt. Định mức thường được tính toán dựa trên các tính chất hình học của lưới (Faces / Vertice), bằng cách lấy sản phẩm chéo của bất kỳ hai cạnh không song song nào nằm trên cùng một mặt phẳng.

Trong các quy tắc OpenGL được chỉ định cho mỗi đỉnh (do đó được gọi là thuộc tính đỉnh) mặc dù chúng chỉ có thể được tính cho mỗi mặt trong trường hợp này, bạn cần chỉ định giống nhau bình thường cho mỗi đỉnh trong một mặt. Các tiêu chuẩn có thể được nội suy bằng OpenGL trên mỗi đỉnh của một mặt (tam giác) để bạn có thể tính toán ánh sáng phản xạ trên mỗi pixel không phải trên mỗi đỉnh, do đó cho kết quả chính xác hơn .

Ánh xạ bình thường : mặt khác là một kỹ thuật trong đồ họa máy tính mã hóa Normals trong bản đồ kết cấu, do đó, mỗi bình thường được mã hóa trên mỗi texel. Nó thường được sử dụng để làm giả ánh sáng của các vết sưng và vết lõm (ví dụ: ánh xạ vết sưng, ánh xạ thị sai).

Do các quy tắc được tính toán dựa trên các đặc tính hình học của lưới / bề mặt, Bản đồ thông thường sẽ cung cấp cho bạn các Quy tắc thay thế có thể mô phỏng các va chạm để thêm chi tiết vào bề mặt mà không cần thêm nhiều đa giác.

Bản đồ bình thường thường được tạo bằng mô hình 3D chi tiết hơn nhiều, sau đó tính toán các quy tắc dựa trên mô hình này và mã hóa nó trong Bản đồ bình thường.

Tại sao chúng ta cần cả hai?

Nói tốt về kết xuất, các thông số và bản đồ bình thường thường được sử dụng cùng nhau để đạt được hiệu ứng ánh sáng cuối cùng, một ví dụ điển hình có thể là một công cụ tạo bóng, trong đó bạn cần bản đồ thông thường để đạt được hiệu ứng ánh sáng, và bạn vẫn sẽ cần hình học bình thường để tính toán những gì được gọi là không gian tiếp tuyến . Không gian tiếp tuyến thường được sử dụng để cung cấp khả năng sử dụng lại cho các bản đồ thông thường.

Hãy nhớ rằng một bình thường được coi là một thuộc tính hình học của bề mặt và có nhiều công dụng hơn là chỉ tính toán ánh sáng. Mặt khác, bản đồ bình thường thường được sử dụng cho các hiệu ứng bề ngoài.

Mở rộng câu trả lời để giải thích tại sao không gian tiếp tuyến là quan trọng:

Câu trả lời ngắn: Không gian tiếp tuyến được sử dụng để làm cho bản đồ bình thường độc lập với hình học cơ bản.

[EDIT] Đã thêm hình ảnh để thể hiện bản đồ bình thường trong không gian tiếp tuyến và bản đồ bình thường trong không gian thế giới.

nhập mô tả hình ảnh ở đây

Câu trả lời dài: Hình dưới đây cho thấy mặt phẳng UV và bình thường xác định không gian tiếp tuyến, khi tạo bản đồ bình thường, chúng ta sẽ biết rằng không gian đã sử dụng sẽ luôn có Điểm bình thường theo hướng Z (đó là lý do tại sao bản đồ bình thường trông hơi xanh) , điều này sẽ giúp chúng ta bỏ qua độ cong bề mặt ** ,.

Không gian tiếp tuyến cho chúng ta lợi thế là mã hóa bản đồ thông thường của chúng ta không bị ràng buộc với một quy tắc lưới cụ thể. Giả sử chúng ta mã hóa bản đồ bình thường của chúng ta trong thế giới hoặc không gian đối tượng, thì mỗi bình thường chúng ta mã hóa sẽ có một hướng dựa trên cách các quy tắc lưới ban đầu khác nhau trong không gian thế giới, chưa kể bản đồ bình thường của bạn sẽ bị ảnh hưởng bởi các biến đổi mô hình.

nhập mô tả hình ảnh ở đây

Trong hai bức ảnh trên, khá rõ ràng rằng không gian tiếp tuyến tạo ra các bản đồ bình thường (phải), không phụ thuộc vào hình học cơ bản vì tất cả các quy tắc được mã hóa theo cùng một hướng với sự thay đổi nhỏ để mô phỏng hiệu ứng của các va chạm.

** độ cong bề mặt được xác định bởi số lượng mà một đối tượng hình học lệch khỏi mặt phẳng hoặc thẳng trong trường hợp của một đường nhưng điều này được xác định theo các cách khác nhau tùy thuộc vào ngữ cảnh.

Đại diện không gian tiếp tuyến


1
Nếu bạn có thể tìm thấy một hình ảnh mô tả cách một kết cấu bình thường không thể được sử dụng một cách nhất quán mà không có trường bình thường và tiếp tuyến được xác định trên cơ sở từng đỉnh, bạn sẽ đưa ra câu trả lời tốt nhất về vấn đề khó hiểu này cho hầu hết các lập trình viên đồ họa mới bắt đầu!
teodron

Câu trả lời hay nhưng thông thường không được OpenGL nội suy trên mỗi khuôn mặt. Bạn phải tự làm điều đó và cung cấp nội suy thông thường cho OpenGL (hoặc mã shader của bạn).
Anastasios G

1
@AnastasiosG Tôi nghĩ rằng anh ấy đang nói về hành vi mặc định của dữ liệu khác nhau khi nó được nội suy qua một hình tam giác bất cứ khi nào một đoạn được tính cho một nguyên thủy cụ thể. Tôi biết có một lá cờ mà bạn có thể sử dụng để nói với OpenGL sử dụng một bình thường cụ thể trong số 3 quy tắc đỉnh có thể có của một tam giác, nhưng đó không phải là hành vi mặc định như tôi biết.
teodron

1
@AnastasiosG Tôi nghĩ rằng chi tiết như vậy sẽ không trả lời bất kỳ ưu tiên nào vì đây không phải là về cách sử dụng OpenGL. Nhưng nếu điều đó có ích, trong kỷ nguyên đường ống cố định, bạn cần đặt hàng glShadeModel (GL_SMOOTH) để yêu cầu openGL nội suy. Trong kỷ nguyên đường ống lập trình, bạn xác định các biến là thay đổi hoặc vào / ra trong trình đổ bóng để OpenGL có thể nội suy.
Concept3d

Tôi muốn thêm rằng các bản đồ vết sưng chỉ đơn giản là các quy tắc (hình học) được nâng / hạ dựa trên kết cấu đen trắng. :)
Entalpi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.