Tại sao chúng ta không sử dụng toàn bộ độ sâu màu cho bản đồ bình thường?


7

Tất cả các bản đồ bình thường tôi đã thấy là màu hồng hoặc hơi xanh. Có vẻ như chỉ có một phạm vi màu nhỏ được sử dụng. Tại sao các nhà phát triển trò chơi cho đi rất nhiều độ chính xác?

Câu trả lời:


11

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, yzá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ó xycả á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.


Vì vậy, lý do chính cho việc không sử dụng độ sâu màu có sẵn của mỗi kênh là các quy tắc được lưu trữ chuẩn hóa? Thay vào đó, nó sẽ không dẫn đến độ chính xác tốt hơn để sử dụng các quy tắc không chuẩn hóa?
danijar

Sau đó, bạn có quá ít độ chính xác còn lại cho dữ liệu thực tế. Tất cả những gì chúng tôi quan tâm là hướng, không phải độ lớn, đối với bản đồ bình thường.
Sean Middleditch

Là một bản đồ bình thường trống màu xanh đậm hoặc xanh nhạt theo cách mà hầu hết các bản đồ bình thường trông như thế nào? Điều đó sẽ giúp tôi hiểu rất nhiều.
danijar

1
@danijar Ý của bạn là gì? Không có gì gọi là bình thường. Một bình thường là luôn luôn chỉ theo một số hướng. Khi bình thường chỉ trực tiếp ra khỏi bề mặt (tức là tất cả các quy tắc trong một bề mặt phẳng), bạn sẽ có được màu sắc (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ụ.
Joseph Mansfield

1
@danijar Đó là vì các giá trị trong vectơ bình thường có thể dao động từ -1 đến +1. Nếu -1 ánh xạ thành 0 và +1 ánh xạ thành 255, thì 0 ánh xạ tới 128. Vì vậy, (0, 0, 1)ánh xạ tới (128, 128, 255).
Joseph Mansfield

6

Đú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.


4

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 :

Không gian tiếp tuyến so với không gian thế giới

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.


1

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)

Câu hỏi của tôi không phải là về kết cấu OpenGL, mà là về các tệp hình ảnh kết cấu. Đối với kết cấu OpenGL trong bộ nhớ, tôi thấy chỉ lưu trữ các thành phần X và Y trong một số triển khai. Tôi xin lỗi vì tôi đã không rõ ràng về điều này.
danijar

Bạn có thể làm điều tương tự cho các tệp trên đĩa. Tài sản nguồn thường chỉ ở các định dạng không hỗ trợ kết cấu RG.
Sean Middleditch

Tôi biết, nhưng câu hỏi của tôi là về lý do chỉ sử dụng một phạm vi độ sâu màu nhỏ cho các tệp bản đồ thông thường. Hay chỉ là giả định của tôi về việc sử dụng dải màu không đúng sự thật?
danijar

1
Vâng, giả định của bạn là hoàn toàn sai sự thật. Phạm vi đầy đủ được sử dụng. Vấn đề là bạn, và tất cả những người khác trong chủ đề này, đang nghĩ về không gian tiếp tuyến bản đồ bình thường. Các bản đồ bình thường này 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. Do 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 ("ánh xạ gập" chứ không phải "ánh xạ gấp" = P), 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 thích bị biến dạng nên chúng không được sử dụng thường xuyên.
Andon M. Coleman

1
@SeanMiddleditch Tôi nghĩ rằng khá phổ biến để lưu trữ các quy tắc được chuẩn hóa thành z = 1 - còn gọi là "bản đồ phái sinh", vì các thành phần XY của bình thường sau đó là các đạo hàm riêng (phủ định) của bề mặt. Sau đó, bạn có thể giải mã nó trong pixel shader bằng cách đặt z = 1 và chuẩn hóa, có thể nhanh hơn tính toán sqrt(1 - x^2 - y^2).
Nathan Reed

1

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.

  • Bình thường của {0,0,1} là bình thường có độ dài đơn vị hướng về phía bạn, chuyển thành màu bản đồ bình thường là {128, 128, 255}.
  • Mặt khác, {0,0, -1} ra xa bạn và đó là màu của {128, 128, 0}.
  • Các tiêu chuẩn của {1,0,0}, {-1,0,0}, {0,1,0} và {0, -1,0} nằm ở góc bên phải theo hướng xem của bạn và bạn có thể làm việc ra màu sắc cho mì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 , 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.


1
Trong thực tế tôi nghĩ cần phải chuẩn hóa lại trong shader mảnh, vì bình thường được lấy mẫu có thể kết thúc không dài đơn vị do các vấn đề về nén kết cấu và lọc song tuyến. Nó cũng không phải đắt tiền - vector bình thường là một hoạt động phổ biến như vậy mà tôi sẽ ngạc nhiên nếu bất kỳ GPU những ngày này không có phần cứng nhanh con đường cho nó.
Nathan Reed

Chắc chắn, tái bình thường hóa là một điều ác không thể tránh khỏi trong hầu hết các trường hợp. Tuy nhiên, lâu rồi là những ngày mà quá trình chuẩn hóa trở nên đắt đỏ đến mức việc tra cứu sơ đồ sẽ nhanh hơn. Tôi hơi nhớ những ngày đó :)
Andon M. Coleman
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.