Tại sao GPU chia không gian clip Z cho W, cho vị trí?


8

Bối cảnh:
Tôi thấy rằng rất dễ sử dụng bộ đệm độ sâu tuyến tính, chỉ sử dụng một sửa đổi nhỏ cho phép biến đổi đỉnh chính tắc. Phương pháp đơn giản nhất được tìm thấy ở dưới cùng của https://www.mvps.org/directx/articles/linear_z/linearz.htm .

Tuy nhiên, lưu ý là nó chỉ hoạt động đối với các hình tam giác không cần phải cắt bớt so với các mặt phẳng gần hoặc xa. (Và một giải pháp thay thế, khi thực hiện phân chia phối cảnh trong trình tạo bóng đỉnh, sẽ mang lại một vấn đề tương tự cho bốn mặt phẳng bực bội khác.)

Bởi vì cắt yêu cầu nội suy tuyến tính để hoạt động trên tất cả bốn tọa độ không gian clip, tôi nghĩ rằng không thể làm việc với độ sâu tuyến tính, chỉ sử dụng trình tạo bóng đỉnh. Nhưng lý do cho tất cả là do Z bị chia cho W.

Tại sao điều đó được thực hiện? X và Y cần được chia theo khoảng cách từ máy ảnh, nhưng tọa độ Z thì không, để phù hợp hoàn hảo với hộp NDC.

Câu trả lời:


13

Nếu bạn đang thực hiện một hình ảnh phối cảnh và mô hình của bạn có các giao điểm ngầm thì nếu bạn sử dụng "Z tuyến tính", các giao điểm đó sẽ xuất hiện ở những vị trí sai.

Ví dụ, hãy xem xét một mặt phẳng mặt đất đơn giản với một đường dây điện thoại, lùi dần vào khoảng cách, xuyên qua mặt đất (và tiếp tục bên dưới). Các giao điểm ngầm sẽ được xác định bởi các giá trị độ sâu nội suy. Nếu chúng không được nội suy với 1/Z, thì khi các đỉnh được chiếu đã được tính toán với phối cảnh, hình ảnh sẽ trông không chính xác.

Tôi xin lỗi vì chất lượng phi thẩm mỹ của các minh họa sau đây nhưng tôi đã thực hiện chúng vào năm 97.

Hình ảnh đầu tiên cho thấy hiệu ứng kết xuất được yêu cầu. (Lưu ý rằng các "giá treo" màu xanh đi một khoảng cách khá dài dưới mặt phẳng mặt đất nên được cắt ở dưới cùng của hình ảnh)

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

Hình ảnh thứ hai này cho thấy kết quả của việc sử dụng bộ đệm độ sâu không tương hỗ: (Lời xin lỗi cho việc thay đổi tỷ lệ - chúng được sao chép từ tài liệu MS Word cũ và tôi không biết điều gì đã xảy ra với tỷ lệ.)

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

Như bạn thấy, kết quả không chính xác.

Trên một lưu ý khác, chắc chắn bạn thực sự muốn một đại diện Z tuyến tính? Nếu bạn đang hiển thị phối cảnh, chắc chắn người ta muốn độ chính xác gần máy ảnh hơn ở khoảng cách xa?

Nhận xét sau của bạn:

Nếu tôi không hiểu nội dung đó thì tôi không hiểu. Nội suy đó là gì?

Điều đầu tiên cần lưu ý là, với phép chiếu phối cảnh tiêu chuẩn, các đường thẳng trong không gian thế giới vẫn là các đường thẳng trong không gian phối cảnh. Khoảng cách / chiều dài, tuy nhiên, không được bảo tồn.

XScreen= =XWortôidZWortôid
YScreen= =YWortôidZWortôid
ZScreen= =1ZWortôid
ZScreen= =Scmộttôie*ZWortôid

[001]mộtnd[200010]
[001]mộtnd[2000,1]

Hệ thống / phần cứng kết xuất sẽ nội suy tuyến tính không gian màn hình z, do đó, tại điểm 1/2 của dòng, khi nó xuất hiện trên màn hình, tức là ở pixel (10, 0), chúng ta sẽ có Z (chiếu) ngược giá trị 0,55, tương ứng với giá trị giá trị Z của không gian thế giới là ~ 1,818. Với các giá trị Z bắt đầu và kết thúc, đây là khoảng 20% ​​dọc theo chiều dài của dòng.

Nếu thay vào đó, chúng tôi đã cố gắng nội suy bằng các giá trị Z ban đầu, chúng tôi sẽ kết thúc với Z tương ứng với giá trị không gian thế giới là 5,5. Miễn là không có gì giao nhau, bạn có thể ổn (Tôi đã không nghĩ về nó quá kỹ lưỡng) nhưng bất cứ điều gì có giao lộ ngầm sẽ không chính xác.

Điều tôi chưa đề cập là một khi bạn giới thiệu kết cấu chính xác phối cảnh (hoặc thậm chí tô bóng chính xác cho phối cảnh), bạn phải thực hiện phép nội suy trên mỗi pixel 1 / w và, ngoài ra, cũng tính toán, trên mỗi pixel, đối ứng của giá trị được nội suy đó.


Tôi không nghĩ rằng tôi có thể hiểu câu trả lời này mà không cần thêm sơ đồ / toán học. Và vâng, chính xác hơn, gần hơn, có thể có ý nghĩa, nhưng một tỷ lệ từ tuyến tính theo far / z, là tiêu chuẩn, không có ý nghĩa. Nó mang lại một bộ đệm độ sâu trở nên tuyến tính hơn khi hai mặt phẳng clip gần nhau hơn. Nó có vẻ như là một sự kết hợp của hai khái niệm: Z tuyến tính không gian màn hình và ánh xạ bộ đệm độ sâu không cố định cho một vụ hack hiệu suất.
Jessy

Cụ thể, đó là, nếu những người đó không được nội suy với 1 / Z mà tôi không hiểu. Nội suy đó là gì?
Jessy

1
Tôi sẽ thêm một số văn bản để hy vọng giải thích
Simon F

Cảm ơn! Tôi nghĩ vấn đề bắt nguồn từ "Hệ thống / phần cứng kết xuất sẽ nội suy tuyến tính không gian màn hình z". Tôi có ấn tượng rằng vị trí NDC sẽ được tính là (x, y, z) / wphân đoạn, nhưng rõ ràng, thay vào đó, chúng ta phải đối phó với một phiên bản nội suy tuyến tính của (x/w, y/w, z/w)? Điều đó có vẻ không hợp lý với tôi vào năm 2018, nhưng sẽ tốt hơn nếu biết đó có phải là hack mà chúng ta phải sống bây giờ không!
Jessy

Để thực hiện kết cấu chính xác kết cấu / tô bóng / bất cứ điều gì, bạn cần nội suy tuyến tính (Val / w), và sau đó, trên mỗi đoạn, thực hiện phép chia theo nội suy tuyến tính 1 / w. Thật khó để giải thích chỉ trong một bình luận, nhưng có một chút giải thích trong computergraphics.stackexchange.com/a/4799/209 . Ngoài ra, hãy tìm kiếm bài viết "Nội suy Hyperbolic" của Jim Blinn
Simon F

6

Sử dụng Z / W cho bộ đệm sâu sẽ đi sâu hơn so với việc chỉ chống lại các mặt phẳng gần và xa. Như Simon đã ám chỉ, điều này có liên quan đến phép nội suy giữa các đỉnh của một tam giác, trong quá trình rasterization.

Z / W là tùy chọn duy nhất cho phép tính toán chính xác các giá trị độ sâu NDC cho các điểm trong phần bên trong tam giác, bằng cách nội suy tuyến tính các giá trị độ sâu NDC từ các đỉnh, trong không gian màn hình . Về nguyên tắc, chúng ta có thể sử dụng bất kỳ chức năng nào chúng ta muốn để ánh xạ không gian camera Z đến giá trị bộ đệm độ sâu, nhưng bất kỳ lựa chọn nào khác ngoài Z / W sẽ yêu cầu toán học phức tạp hơn để thực hiện trên mỗi pixel, sẽ chậm hơn và khó khăn hơn xây dựng trong phần cứng.

Lưu ý rằng nếu bạn sử dụng bộ đệm độ sâu tuyến tính, thì dĩ nhiên giá trị độ sâu nội suy tuyến tính sẽ chính xác trong không gian thế giới ... nhưng nói chung, không phải trong không gian màn hình! Và đó là không gian màn hình quan trọng đối với quá trình rasterization, vì chúng ta cần có khả năng tạo các giá trị độ sâu chính xác phối cảnh (và các giá trị thuộc tính khác, như UV) cho từng trung tâm pixel hoặc các điểm mẫu khác, trong giới hạn không gian màn hình của một tam giác đang rasterized.


Tôi không biết cách thiết kế GPU, nhưng đối với tôi, dường như tất cả những gì cần thiết là nội suy Z thay vì Z / W, cho độ sâu tuyến tính và nội suy Z / W vẫn có thể xảy ra sau đó cho mọi thứ có thể nhìn thấy. Tôi vẫn không thể biết đây là vấn đề lý luận hay là một trong những người không ai quan tâm nên chúng tôi không bận tâm đến việc cập nhật.
Jessy

Nội suy Z thay vì Z / W không cho kết quả chính xác trong không gian màn hình. Z / W.
Nathan Reed

Đúng. Nhưng nếu bộ đệm độ sâu được lượng tử hóa với độ chính xác thấp hơn vị trí, thì ngoài việc là người thực hiện khi nó hoạt động, thì không nên lưu trữ một đoạn không gian màn hình Z. Nếu chúng ta có thể nội suy tuyến tính. để xảy ra trong không gian xem. Và Z cần được nội suy trước khi chia cho W, cho bộ đệm sâu và sau đó, cho những gì bạn đã trải qua. Vì vậy, câu trả lời cho câu hỏi của tôi là "bởi vì GPU luôn chỉ được nội suy trong không gian clip bởi vì đó là giải pháp thực tế duy nhất trên các GPU đầu tiên và nó đã hoạt động đủ tốt kể từ đó"?
Jessy

Tôi không làm theo ý của bạn về "lượng tử hóa với độ chính xác thấp hơn vị trí" hoặc "lưu trữ một đoạn không gian màn hình Z".
Nathan Reed

1
Ngoài ra, "Z cần được nội suy trước khi chia cho W, cho bộ đệm có chiều sâu". Đó là những gì tôi đã cố gắng giải thích. Bạn nhận được câu trả lời sai nếu bạn nội suy Z (hoặc bất cứ thứ gì khác) trong không gian màn hình mà không chia nó cho W. trước. Bạn dường như bị mắc kẹt với ý tưởng này rằng bộ đệm Z tuyến tính sẽ chỉ hoạt động nếu chúng ta không chia cho W. Nhưng nó sẽ không hoạt động. Nó sẽ không nội suy trong không gian màn hình đúng cách.
Nathan Reed
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.