Tìm hiểu về Bump Mapping, Normal Mapping và Displacement Mapping


(Nguyễn Lương Thọ) #1

Displacement mapping, bump mapping và normal mapping là các thuật ngữ rất phổ biến trong cộng động thiết kế đồ hoạ 3D. Đây là các phương pháp làm tăng chi tiết cho một bề mặt đơn giản. Phần lớn anh chị em trong ngành chưa nắm hết được nguyên lý của các phương pháp này vì vậy phát sinh những hiểu lầm trong quá trình sử dụng. Hy vọng bài viết này sẽ làm sáng tỏ về bản chất thật sự của chúng. Tuy nhiên, bài viết này không nhằm mục đích hướng dẫn cụ thể từng bước thực hành các phương pháp này trong các phần mềm 3D.

1. Displacement Mapping

Chúng ta sẽ mô tả phương pháp này trước vì nó dễ hiểu, rõ ràng. Hơn nữa, vì kết quả của displacement mapping là kết quả chính xác, nên chúng ta có thể dùng nó để làm kết quả chuẩn để đối chiếu với các phương pháp bên dưới.

Cách thức hoạt động của displacement mapping khá đơn giản. Giả sử chúng ta có một polygon hình chữ nhật (chỉ với 4 cạnh và 4 đỉnh), và một hình trắng đen (gọi là displacement map). Chúng ta muốn làm cho polygon này trở nên “lồi lõm” dựa vào giá trị độ sáng trong displacement map. Để làm điều này trước hết chúng ta chia nhỏ polygon hình chữ nhật ra thành các ô lưới với rất nhiều đỉnh, sau đó chúng ta sẽ di chuyển (displace) từng đỉnh dựa theo giá trị trắng đen trong hình displacement map để tạo các khối lồi lõm (hình 1)

Hình 1: Displacement mapping

Ưu điểm của phương pháp này là sẽ cho ra kết quả rất chính xác, với điều kiện là ảnh displacement map đủ độ phân giải và độ phân giải của ô lưới cũng phải đủ cao để thể hiện các chi tiết trong displacement map.

Nhược điểm là giờ đây chúng ta có qua nhiều polygon và vertex (đỉnh). Vì vậy thời gian render sẽ lâu hơn và bộ nhớ RAM cũng sẽ bị tiêu tốn nhiều hơn (có thể gấp hàng trăm hoặc hàng nghìn lần).

2. Điều gì khiến chúng ta cảm nhận được không gian 3D và hình khối 3D?

Trước khi tìm hiểu nguyên lý của bump mapping và normal mapping, chúng ta cần trả lời câu hỏi trên. Đây cũng là câu hỏi xuất hiện trong ngành mỹ thuật / hội họa.

Xét cho cùng, hình mà chúng ta render chỉ là một hình 2D chứ không phải 3D. Vậy tại sao khi nhìn vào hình chúng ta vẫn có thể tưởng tượng ra không gian 3D và các khối dáng 3D. Có rất nhiều yếu tố trong hình render giúp bộ não của chúng ta làm được điều này. Chúng ta có thể chia các yếu tố này vào 2 nhóm chính

Nhóm 1: Yếu tố hình học, ví dụ như

  • Sự che khuất (occlusion): Vật đằng trước che khuất vật đằng sau
  • Luật phối cảnh (perspectivity): bao gồm các hiệu ứng như
  • Vật càng ở xa camera thì càng nhỏ (foreshortening)
  • sự di chuyển tương đối (hiệu ứng parallax): Vật càng ở xa camera thì chúng ta cảm thấy nó di chuyển càng ít. Vì dụ, hãy tưởng tượng bạn đang ngồi trong một chiếc xe chạy qua miền đồng quê vào ban đêm. Bạn sẽ thấy những vật ở gần bạn di chuyển rất nhanh (như lề đường, đèn đường). Những vật ở xa (như đồi núi) thì di chuyển rất ít. Còn mặt trăng và sao thì gần như không hề di chuyển vì chúng ở quá xa.

Nhóm 2: Yếu tố ánh sáng, ví dụ như

  • [Quan trọng] Định luật Lambert: Lượng ánh sáng mà một polygon nhận được tuỳ vào hướng của polygon đó so với hướng chiếu sáng.
  • Bóng đổ (trực tiếp): là bóng do nguồn sáng tạo nên
  • Bóng đổ (gián tiếp); là bóng do ánh sáng gián tiếp từ nguồn sáng tạo nên. Trong đồ hoạ máy tính, loại bóng gián tiếp này hay được làm giả bằng hiệu ứng ambient occlusion. Nếu muốn mô phỏng chính xác thì phải sử dụng global illumination (GI).

Sở dĩ “Định luật Lambert” được ghi chú là “quan trọng” vì nó chính là mấu chốt để hiểu nguyên lý của bump mapping. Phần 3 sẽ trình bày rõ hơn về định luật này.

Có thể thấy, để tạo được những hình khối 3D chân thật tuyệt đối, chúng ta cần phải tái hiện được TẤT CẢ các yếu tố trên. Phương pháp displacement mapping đáp ứng được yêu cầu này, vì vậy cho kết quả chính xác nhất và có thể dùng làm tiêu chuẩn để đối chiếu các phương pháp khác.

3. Định luật Lambert (Lambertian Law) và “hướng nhìn” của polygon

Nếu nhìn vào hình 2 (bên trái), chúng sẽ thấy một khối hộp. Chúng ta rõ ràng cảm nhận được đây là một vật thể 3D. Tại sao lại như vậy? Bởi vì ba mặt của khối hộp có 3 sắc độ khác nhau, mặc dù cả ba đều cùng vật liệu với cùng một màu sắc! Nếu 3 mặt này có cùng một sắc độ như trong hình 2 (bên phải) thì chúng ta không thể nào có được cảm nhận 3D cả.

Hình 2. Sự khác nhau về sắc độ giúp chúng ta cảm nhận được hình khối 3D.

Nguyên nhân của sự khác nhau về sắc độ này chính là định luật Lambert. Khi một polygon nhìn thẳng về phía nguồn sáng, thì cường độ ánh sáng mà nó nhận được là nhiều nhất. Khi polygon đó quay mặt sang hướng khác, thì cường độ ánh sáng nhận được sẽ giảm do đó khi render thì cũng sẽ bị tối đi. Điều này được minh hoạ ở hình 3.

Hình 3. Định luật Lambert: khi polygon nhìn càng trực tiếp về phía ánh sáng thì lượng ánh sáng mà nó nhận được càng lớn. Ngược lại, càng quay hướng nhìn đi chỗ khác thì sẽ càng tối.

Trong hình 3, mũi tên màu đỏ thể hiện “hướng nhìn” của polygon. Trong đồ hoạ máy tính 3D, mũi tên này gọi là “vector pháp tuyến”, tiếng Anh gọi là normal vector (hay gọi tắt là “normal”). Trục của vector luôn vuông góc với polygon và hướng mũi tên sẽ hướng “ra ngoài” vật thể. V-Ray hay bất kỳ rendering engine nào khác đều dùng mũi tên normal này để tính toán định luật Lambert, giúp tạo nên những sắc độ khác nhau trên một vật thể 3D.

Lý do của việc giới thiệu khái niệm về mũi tên normal ở đây là vì nó chính là mấu chốt để hiểu về bump mapping (trong đó có cả normal mapping).

Mặc dù normal chỉ là một khái niệm mang tính tưởng tượng, nhưng nó đóng một vài trò rất qua trọng trong bất kỳ chương trình đồ hoạ 3D nào. Nó là công cụ để biểu đạt “hướng” của một bề mặt (bất kể đó là bề mặt của mesh hay của NURBS). Nó không chỉ được dùng trong bump mapping mà trong rất rất nhiều các hiệu ứng khác trong đồ họ 3D. Hy vọng là khi đọc xong bài viết này, anh chị em tron ngành thiết kế 3D sẽ ý thức là mũi tên normal luôn tồn tại chung với các vật thể mesh trong 3ds Max.

Trước khi kết thúc phần này, có một câu hỏi cũng khá quan trọng cần được làm rõ: Chúng ta đã biết normal của một polygon phẳng là như thế nào, vậy làm sao để xác định normal của một bề mặt cong?

Để trả lời một cách cách trưc quan và dễ hiểu, chúng ta hãy luôn nhớ là mũi tên normal luôn “vuông góc” và “hướng ra ngoài” bề mặt vật thể. Vì vậy giả sử nếu ta có một khối cầu, thì các mũi tên normal sẽ trông như hình 4 (bên trái). Hình 4 (bên phải) là một ví dụ khác về bề mặt cong. Điểm cần ghi nhớ ở đây là: mỗi điểm trên bề mặt cong sẽ có hướng mũi tên normal khác nhau. . Trong phần tiếp theo chúng ta sẽ thấy normal mapping và bump mapping lợi dụng điều này để tạo cảm giác gồ ghề.

Hình 4: Các mũi tên normal của bề mặt cong.

4. Nguyên lý chung của bump mapping và normal mapping

Hình 5 là sự so sánh giữa một bề mặt một bề mặt phằng và một bề mặt gồ ghề. Hãy lưu ý sự khác nhau về các normal giữa 2 trường hợp (mũi tên xanh và đỏ).

Hình 5: So sánh lát cắt của một bề mặt phẳng và một bề mặt gồ ghề

Nguyên lý của bump mapping và normal mapping rất đơn giản: khi render bề mặt polygon phẳng, rendering engine sẽ không dùng các mũi tên normal màu xanh để tính toán định luật Lambert, mà sẽ “mượn” các mũi tên normal màu đỏ của bề mặt gồ ghề để thực hiện việc này (xem hình 6)

Hình 6: Bề mặt phẳng “mượn” các mũi tên normal từ bề mặt gồ ghề

Chính việc sử dụng normal của bề mặt gồ ghề để render bề mặt phẳng giúp bề mặt phẳng có sự thay đổi về sắc độ theo định luật Lambert và khiến người xem có cảm giác bề mặt trở nên gồ ghề. Thực chất, bề mặt vẫn luôn là một polygon phẳng hoàn toàn. Dó đó, số lượng polygon và vertex không hề thay đổi như trong phương pháp displacement mapping.

Nếu chúng ta xem lại danh sách các yêu tố giúp người xem cảm nhận được khối dạng 3D (trong phần 2), thì sẽ thấy rằng bump mapping chỉ thoả mãn được một yếu tố duy nhất: đó là định luật Lambert. Dó đó bump mapping và normal mappingkhông phải là phương pháp chính xác hoàn toàn. Phần 6 sẽ minh hoạ rõ hơn về các hạn chế của chúng và đưa ra những lời khuyên thực tế.

Hình 7: Một bề mặt phẳng được render với bump mapping.

5. Điểm khác nhau giữa bump mapping và normal mapping.

Điểm khác nhau của 2 thuật toán này chỉ nằm ở chỗ làm cách nào để lấy được các normal của bề mặt gồ ghề. Cụ thể như sau.

Bump Mapping: thuật toán này sử dụng một ảnh map trắng-xám-đen (gọi là bump map) biểu diễn hình dạng gồ ghề. Với ảnh map này, thuật toán sẽ dễ dàng tính toán ra các mũi tên normal của bề mặt gồ ghề, sau đó dùng các normal này để tính toán định luật Lambert cho bề mặt phẳng.

Normal Map: Khác với bump mapping, normal mapping sẽ không tự tính toán ra các normal từ ảnh map trắng-xám-đen, mà các normal đã được tính toán sẵn từ trước (bằng một phần mềm nào đó) và lưu vào một ảnh map gọi là normal map. Thuật toán normal mapping chỉ việc load các giá trị normal trực tiếp từ ảnh normal map và đưa vào tính toán định luật Lambert. Trong toán học, mũi tên normal thực chất là một vector và có thể được diễn đạt bằng 3 con số thập phân. 3 con số này được lưu thành 3 giá trị màu red, green, blue. Đây là lý do mà normal map là ảnh màu chứ không phải ảnh trắng đen như bump map

Vậy có thể thấy:

  • Kết qủa render mà 2 thuật toán này mang lại là giống nhau, vì cả 2 đều chỉ mô phỏng lại định luật Lambert bằng cách “mượn” các normal từ một bề mặt phức tạp.

  • Normal mapping sẽ xử lý nhanh hơn vì nó không cần phải tự tính toán ra các mũi tên normal như bump mapping. Chính vì vậy mà normal mapping được “ưa chuộng” hơn trong real-time rendering (game).

  • Tuy nhiên trong quá trình xử lý tính toán, normal mapping sẽ tốn bộ nhớ gấp 3 lần bump mapping (vì trên nguyên tắc, ảnh màu chiếm bộ nhớ gấp 3 lần ảnh trắng-xám-đen).

Hình 8: Bump Map và Normal map của cùng một bề mặt

Nguồn: Internet


(Tigi En Art) #2

Bài viết còn mang tính máy móc quá, cảm giác vẫn gg trans.
“Chúng ta cũng trực tiếp nhìn thấy mũi tên normal trong 3ds Max bao giờ” ? < ví dụ.