Tránh chiến đấu z với bề mặt trùng hợp


26

Khi kết xuất hai bề mặt đồng phẳng chồng chéo, một vấn đề phổ biến là "chiến đấu z", trong đó trình kết xuất không thể quyết định bề mặt nào trong hai bề mặt gần máy ảnh hơn, tạo ra các tạo tác trực quan trong khu vực chồng lấp.

Giải pháp tiêu chuẩn cho vấn đề này là cung cấp cho các bề mặt một độ lệch nhẹ khi thiết kế mô hình. Còn có những giải pháp nào nữa ko?


2
Bạn có thể kiểm tra bộ đệm độ sâu logarit. Có một bài viết về gamasutra
Xà phòng

1
Khi bạn nói "đồng phẳng", bạn có nghĩa là "gần như" hoặc "chính xác" đồng phẳng và nếu sau này, các bề mặt đó có bao giờ giống hệt bề mặt / hình tam giác không? Phần cứng kết xuất phải có tính xác định (giả sử bạn không gửi theo thứ tự ngẫu nhiên) cho trường hợp cuối cùng và không phải chiến đấu. Nếu đó là trường hợp bề mặt không giống nhau nhưng chính xác là đồng phẳng, bạn có thể cập nhật mô hình để tách các bề mặt thành các phần chồng chéo và không chồng chéo không?
Simon F

@SimonF, bởi "co-planar" Ý tôi là "chính xác là đồng phẳng". Giải pháp của So vật chỉ hoạt động trong trường hợp "gần như phẳng".
Đánh dấu

Bạn có thể cho một ví dụ về bề mặt của bạn? Điều duy nhất tôi có thể nghĩ ra khỏi đỉnh đầu là các hình tam giác trùng lặp như @SimonF đã đề cập.
RichieSams

@RichieSams trường hợp phổ biến nhất mà tôi có thể nghĩ đến là đề can, nơi bạn không cần các hình tam giác chính xác.
RYS

Câu trả lời:


10

Nếu các bề mặt là đồng phẳng chính xác, số phận của bạn phụ thuộc vào các vị thần FPU; bạn sẽ có nhiều khả năng có Z-combat. Nếu tam giác là giống hệt nhau và bạn làm chính xác toán học cùng với nhau, bạn sẽ kết thúc với Z-giá trị tương tự cho cả hai. Nhưng một lần nữa, điều này sẽ chỉ xảy ra nếu các phép toán của bạn giống hệt nhau cho cả hai. (Vì, nói chung, các hoạt động của FPU không giao hoán)

Một giải pháp khả thi là hoàn toàn không sử dụng bộ đệm Z. Thay vào đó, bạn có thể sử dụng Thuật toán của Họa sĩ . Cấp, điều này đi kèm với tất cả các vấn đề của thuật toán họa sĩ là tốt. Nhưng, nó sẽ giải quyết được Z-combat.

Trong trường hợp ví dụ của bạn về Đề can không gian màn hình (SSD), giải pháp phổ biến là sử dụng một phần bù, hay còn gọi là khối lập phương mỏng đơn giản. Xem phần trình bày của Warhammer 40k về SSD để tham khảo. Hoặc bài đăng của Bart Wronski giải quyết một số vấn đề khác với đề can, nhưng cũng liên kết đến một vài bài thuyết trình khác về SSD


5
Hiển thị lại cùng một hình dạng với cùng các biến đổi sẽ tạo ra các giá trị độ sâu giống nhau mỗi lần. (Tức là nó không phải là một sức mạnh , đó là một ý chí ). Đó là lý do tại sao chiếu sáng nhiều phía trước hoạt động, ví dụ.
Nathan Reed

@NathanReed đã sửa. Cảm ơn bạn đã làm rõ
RichieSams

1
Để có được chức năng đó, bạn cần sử dụng vòng loại bất biến trong glsl: opengl.org/wiki/Type_Qualifier_%28GLSL%29#Invariance_qualifier
ashleymithgpu

Lưu ý rằng các biểu thức đổ bóng giống hệt nhau (và đầu vào, rõ ràng) khi đánh giá các vị trí đỉnh có thể không đủ để có kết quả giống hệt nhau vì một số tối ưu hóa có thể phụ thuộc vào phần còn lại của trình đổ bóng. GLSL có từ khóa "bất biến" để khai báo các đầu ra shader phải được đánh giá giống hệt nhau trong các shader khác nhau.
Firadeoclus

2

Đây là cách tôi đã giải quyết điều này trong quá khứ:

  1. Vẽ đối tượng đầu tiên (đối tượng sẽ xuất hiện phía sau đối tượng khác) bằng cách kiểm tra độ sâu nhưng không viết sâu
  2. Vẽ đối tượng thứ hai bằng cách kiểm tra độ sâu và viết sâu. Điều này sẽ không gây ra chiến đấu z vì chúng tôi đã không viết bất kỳ chiều sâu nào trong bước 1.
  3. Vẽ đối tượng đầu tiên bằng cách chỉ ghi vào bộ đệm sâu và không vào bộ đệm màu. Điều này đảm bảo bộ đệm độ sâu được cập nhật cho bất kỳ pixel nào được bao phủ bởi đối tượng 1 nhưng không phải bởi đối tượng 2.

Lưu ý, các đối tượng cần phải được vẽ liên tiếp để làm việc này.


0

Tùy thuộc vào trình kết xuất của bạn, bạn có thể làm cho các bề mặt trở nên "mờ" hơn khi áp dụng phần bù cực tiểu ở độ sâu đa mẫu bằng thuật toán nhiễu. Điều này sẽ dẫn đến một loại hiệu ứng trộn cho các bề mặt ở gần độ sâu gần. Đối với những gì tôi biết, việc thiết lập độ sâu cho mỗi mẫu trong shader mảnh là khá gần đây trong OpenGL và sau đó chỉ là một phần mở rộng.

OpenGL có Polygon Offerset nhưng yêu cầu biết trước bạn sắp kết xuất một thứ gì đó. Mặc dù không khả thi đối với các bề mặt trong một mô hình duy nhất, ví dụ, nó có thể hoạt động độc đáo khi hiển thị một con đường được phủ lên trên một mảnh đất.

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.