Câu trả lời:
Các màu sắc trong bản đồ bình thường thể hiện các quy tắc tại mỗi điểm. Nếu bình thường là (x, y, z)
, các điểm ảnh tương ứng trong bản đồ bình thường sẽ có mỗi x
, y
và z
ánh xạ từ dãy núi này (-1,1)
đến (0,255)
để có được các thành phần màu đỏ, xanh lá cây, và màu xanh tương ứng.
Bây giờ trục z thường được sử dụng làm hướng ra khỏi bề mặt. Một bề mặt hoàn toàn bằng phẳng, với (0, 0, 1)
các thông số trên khắp, sẽ có x
và y
cả ánh xạ tới 128
, và z
được ánh xạ tới 255
. Điều đó có nghĩa là màu kết quả là (128, 128, 255)
màu xanh da trời mà bạn thường thấy trong các bản đồ bình thường.
Các vết sưng trên bề mặt lệch khỏi mức bình thường này, loại bỏ một chút thành phần màu xanh lam và đưa nó vào các thành phần màu đỏ và / hoặc màu xanh lá cây (tùy thuộc vào hướng mà vết sưng phải đối mặt). Nói chung, các va đập trên các bề mặt không đặc biệt phóng đại, do đó bản đồ bình thường vẫn chủ yếu là màu xanh. Bạn sẽ thấy magentas và cyans cho các va chạm phải đối mặt với các trục x và y.
Nếu bạn tìm thấy bản đồ bình thường cho một bề mặt có những va chạm mạnh trong đó, chẳng hạn như bản đồ bình thường bằng gạch , bạn sẽ thấy rằng các cạnh có rất nhiều màu đỏ-ish và green-ish.
(128, 128, 255)
, đó là màu xanh nhạt mà bạn có thể đề cập đến. Đó là một nửa giữa màu xanh (0, 0, 255)
và trắng đầy đủ (255, 255, 255)
. Xem các góc của hình ảnh này cho một ví dụ.
(0, 0, 1)
ánh xạ tới (128, 128, 255)
.
Đúng là nhiều bản đồ bình thường trong không gian tiếp tuyến chỉ có một dải màu giới hạn. Bản đồ thông thường không gian đối tượng hoặc không gian thế giới sẽ có dải màu rộng hơn, nhưng nếu chúng ta chỉ sử dụng bản đồ bình thường không gian tiếp tuyến trong trò chơi của mình (như hầu hết các nhà phát triển làm), đó là một câu hỏi khá chính đáng để hỏi tại sao chúng ta không ' Chọn một mã hóa giao dịch ngoài phạm vi mà chúng tôi không sử dụng để đạt được độ chính xác cao hơn.
Ví dụ: thay vì ánh xạ [-1, 1] thành [0, 1] cho từng thành phần, chúng tôi có thể quyết định chúng tôi sẽ ánh xạ [-0,5, 0,5] thành [0, 1] cho các thành phần XY và [ 0,5, 1] đến [0, 1] cho thành phần Z. Điều đó sẽ cho chúng ta gấp đôi độ chính xác.
Câu trả lời là chúng ta thường không cần độ chính xác cao hơn và việc sử dụng ánh xạ chuẩn cho chúng ta phạm vi để xử lý mọi quy tắc có thể hiểu được.
Tuy nhiên, đôi khi chúng ta cần chính xác hơn. Trên các bề mặt gần như nhẵn nhưng không hoàn toàn và có các va chạm rất tinh tế, sự kết hợp của phạm vi [-1, 1] cộng với nén DXT chắc chắn có thể tạo ra dải có thể nhìn thấy do độ chính xác của các thông số kém. Trong các trò chơi tôi đã làm việc, chúng tôi đã thêm một tham số "cường độ bản đồ bình thường" cho mỗi vật liệu cho phép bạn điều chỉnh hiệu quả mã hóa cho một kết cấu cụ thể, do đó bạn có thể sử dụng phạm vi nhỏ hơn như [-0,5, 0,5] hoặc [-0.1 , 0,1] nếu bạn muốn, và do đó có được độ chính xác cao hơn nhiều.
Một ví dụ về loại bề mặt mà chúng ta sẽ sử dụng này là mui xe ô tô hoặc cửa sổ kính ở bên cạnh tòa nhà (không hoàn toàn bằng phẳng, nhưng hơi cong vênh). Cả hai đều là bề mặt cứng, sáng bóng với độ cong khá tinh tế, điều đó có nghĩa là bạn có thể dễ dàng nhìn thấy bất kỳ sự không hoàn hảo nào trong các quy tắc do ảnh hưởng của chúng đối với phản xạ hình khối. Điều chỉnh mã hóa bản đồ bình thường để có độ chính xác cao hơn đã cải thiện đáng kể sự xuất hiện của các bề mặt này.
Tuy nhiên, chúng là ngoại lệ thay vì quy tắc và mã hóa [-1, 1] mặc định là khá đủ cho hầu hết tất cả các bề mặt trong trò chơi.
Ai nói chúng ta không? Bạn đang giới hạn quá trình suy nghĩ của mình vào Bản đồ bình thường không gian Tangent, mà (nói chung) luôn luôn chỉ ra khỏi bề mặt mà chúng được ánh xạ lên. Ngoài ra còn có Bản đồ bình thường Không gian Thế giới / Đối tượng, chứa mọi màu sắc của cầu vồng vì chúng không liên quan đến không gian tọa độ của bề mặt.
Là một thử nghiệm thú vị, bạn nên nhân bản đồ bình thường không gian tiếp tuyến với ma trận TBN và xuất màu kết quả thay vì ánh sáng bình thường. Lưu ý cách màu sắc thay đổi đáng kể, vì chúng hiện đang ở trong không gian đối tượng (hoặc không gian xem tùy thuộc vào cách bạn tạo ma trận TBN)?
Mặc dù vậy, bạn vẫn chưa hoàn thành, vì các quy tắc nằm trong không gian đối tượng / khung nhìn, bạn có thể sẽ có khá nhiều vectơ có giá trị âm. Bạn cần thiên vị và chia tỷ lệ màu sắc để các giá trị âm chiếm nửa dưới của không gian màu và giá trị dương chiếm cao hơn (nếu bạn thực sự muốn trực quan hóa bản đồ bình thường, nghĩa là).
Nếu bạn không muốn tự mình thực hiện thử nghiệm, bạn có thể thấy sự khác biệt giữa không gian thế giới và không gian tiếp tuyến trong hình ảnh dưới đây :
Các bản đồ bình thường không gian tiếp tuyến nằm trong một không gian tọa độ đặc biệt đảm bảo Z dương luôn luôn bình thường trên bề mặt. Vì XYZ thường được mã hóa thành RGB và hầu hết các bề mặt tương đối bằng phẳng (ví dụ: sản phẩm chấm giữa kết cấu bình thường cung cấp và một vectơ tiếp xúc với bề mặt tại bất kỳ điểm nào khá gần với 0) B chiếm ưu thế không gian màu trong không gian tiếp tuyến.
Trong không gian thế giới / đối tượng, không có màu chủ đạo, nhưng những bản đồ bình thường này không muốn bị biến dạng. Cuối cùng, khi sử dụng bản đồ không gian tiếp tuyến, ánh sáng được thực hiện trong không gian tiếp tuyến hoặc bản đồ bình thường được chuyển thành không gian thế giới / chế độ xem trước khi chiếu sáng. Bằng cách trì hoãn chuyển đổi này (hoặc tránh hoàn toàn) cho đến khi kết xuất thời gian, các đối tượng có thể được xoay và tọa độ kết cấu có thể bị biến dạng mà không làm mất hiệu lực bản đồ bình thường. Các bản đồ thông thường trong không gian thế giới thường được dành riêng cho hình học thế giới tĩnh và có thể được sử dụng cho Bộ đệm G bình thường trong bóng mờ hoãn lại.
Bạn có thể lưu trữ chỉ hai thành phần của bản đồ bình thường được chuẩn hóa trong kết cấu RG và tính toán lại thành phần thứ ba một cách tầm thường. Tôi không biết tại sao điều này không phổ biến hơn ngoài hiệu năng của hoạt động căn bậc hai trong việc này.
1 = sqrt(x^2 + y^2 + z^2)
z^2 = 1 - x^2 - y^2
z = sqrt(1 - x^2 - y^2)
sqrt(1 - x^2 - y^2)
.
Chúng tôi thực sự sử dụng đầy đủ độ sâu màu.
Trước hết, các thông số nên có độ dài đơn vị, nếu không chúng ta cần thực hiện tái chuẩn hóa đắt tiền (và không cần thiết) trong trình đổ bóng mảnh.
Hãy giả sử rằng bạn đang nhìn vào một kết cấu trực diện, như thể trong một trình chỉnh sửa hình ảnh.
Vì vậy, chỉ với sáu hướng chính (lên / xuống / trái / phải / trước / sau), chúng ta cần các giá trị 0, 128 và 255 trong mỗi kênh R, G và B. Rõ ràng chúng không phải là 6 hướng duy nhất mà một thứ gì đó có thể được chỉ vào, vì vậy chúng ta cũng cần các giá trị trung gian. Đó là độ sâu đầy đủ màu sắc.
Lý do tại sao hầu hết các bản đồ bình thường có màu xanh phấn là vì hầu hết thời gian chúng mã hóa các quy tắc hướng về phía người xem (điểm đầu tiên của tôi ở trên) và hầu hết thời gian còn lại chúng mã hóa các quy tắc đang chỉ ra nhiều hơn- hoặc ít hơn đối với người xem. Nhưng họ không có , và không sử dụng độ sâu màu đầy đủ, họ sẽ mất khả năng chỉ theo bất kỳ hướng tùy ý nào.
Điều này thực sự không liên quan gì đến bất kỳ khái niệm nào về "độ chính xác", nó chỉ xuất phát từ các quy tắc định hướng có xu hướng chỉ vào khi được mã hóa trong bản đồ bình thường.