Vượt ra khỏi giới hạn trong các trò chơi AAA


21

Trong nhiều tựa game AAA phổ biến (đặc biệt là các trò chơi công cụ nguồn), khi người chơi đến một khu vực 'không được phục vụ', chẳng hạn như ngoài giới hạn, hoặc noclipping dưới bản đồ; một hiệu ứng lạ xảy ra trên màn hình (rách đệm?).

Nó có thể được mô tả là tương tự như dấu vết của các cửa sổ mà Windows XP có thể để lại phía sau một cửa sổ bị kéo trong khi hệ thống bị treo.

Tôi chỉ có thể nói rằng các nhà phát triển không xóa bộ đệm màu khi làm mới màn hình?

Đúng không? Nếu vậy, tại sao?


8
BTW, đây thường được gọi là hiệu ứng "Hall of Mirrors" hoặc HOM.
Nathan Reed

Câu trả lời:


35

Ngày xửa ngày xưa, việc xóa bộ đệm màu và độ sâu thực sự mất thời gian. Làm rõ ràng có nghĩa là card đồ họa sẽ phải đi từng pixel của bộ đệm khung và viết một giá trị cho nó.

Bởi vì điều này, các nhà phát triển trò chơi nhận thấy rằng sẽ hiệu quả hơn khi chỉ cần giả định rằng mọi pixel sẽ được hiển thị lại. Họ đã phát triển nhiều kỹ thuật để làm việc này.

Bộ đệm màu là dễ nhất để bỏ qua. Ít dễ dàng hơn là bộ đệm sâu, bởi vì nó sẽ bị ô nhiễm với dữ liệu cũ. Vì vậy, những gì họ đã làm là đơn giản.

Trên khung 0, chúng sẽ hiển thị với một glDepthRange(hoặc D3D tương đương) của (0, 0,5), và họ sẽ sử dụng một glDepthFuncsốGL_LESS (hoặc GL_LEQUAL). Điều này có nghĩa là giá trị độ sâu xa nhất bạn từng có trong bộ đệm độ sâu là 0,5. Vì vậy, giá trị lớn nhất trong bộ đệm độ sâu ở cuối khung 0 là 0,5 (giả sử bạn đã viết cho mọi pixel).

Trên khung 1, họ sẽ thay đổi phạm vi độ sâu thành (1, 0,5). Lưu ý rằng trong trường hợp này, giá trị độ sâu gần lớn hơn độ sâu xa. Nhưng họ cũng sẽ thay đổi độ sâu func thành GL_GREATER(hoặc GL_GEQUAL), đảo ngược ý nghĩa của kiểm tra độ sâu. Vì giá trị lớn nhất trong bộ đệm sâu là 0,5, mọi thứ bạn viết sẽ có giá trị lớn hơn giá trị này. Vì kiểm tra độ sâu đã được đảo ngược, điều này có nghĩa là mọi thứ được viết trên khung 0 giờ đây sẽ xa hơn bất kỳ thứ gì có thể được viết trên khung 1. Ở cuối khung 1, nhỏ nhất giá trị trong bộ đệm độ sâu hiện là 0,5.

Và sau đó họ lặp lại.

Trên bất kỳ phần cứng nào được sản xuất từ ​​khoảng năm 2003, đây không còn là một sự tối ưu hóa nữa. Thật vậy, nó là một tối ưu hóa tiêu cực . Xóa bộ đệm sâu thực sự làm cho phần cứng nhanh hơn . Không, thực sự.

Về cơ bản, những gì xảy ra là việc xóa bộ đệm không thực sự viết bất cứ điều gì. Họ lưu trữ một số bit trong bộ nhớ cache của GPU cho phép hệ thống biết màu sắc / độ sâu mà chúng đã bị xóa. Khi hệ thống cố ghi vào dòng bộ đệm của bộ đệm khung, bạn không cần phải đọc những gì ở đó, vì nó đã biết rằng đó là một trường trống có giá trị màu / độ sâu rõ ràng. Nếu bạn cố gắng pha trộn với những gì ở đó hoặc làm một bài kiểm tra chuyên sâu, một lần nữa, không cần phải đọc: nó biết giá trị nào để pha trộn / kiểm tra với / chống lại.

Vì vậy, mỗi lần đọc / sửa đổi / ghi đầu tiên bạn thực hiện trên mỗi dòng bộ đệm sau khi xóa về cơ bản là ghi. Nó miễn phí .

Thêm vào đó, có một bộ đệm có chiều sâu lởm chởm có thể hoạt động chống lại Hyper-Z / HVELial-Z / bất kỳ tối ưu hóa loại bỏ Z nào trong phần cứng. Vâng, cảnh của bạn sẽ chống lại những người cuối cùng khi bạn thêm chi tiết. Nhưng nếu bộ đệm độ sâu của bạn bị lởm chởm từ các kết xuất trước đó, ngay cả khi các đối tượng nền đó ở dưới nền, nó có thể ảnh hưởng đến hiệu quả của các kỹ thuật loại bỏ Z. Và điều đó sẽ không giúp hiệu suất.

Vì vậy, bạn không bao giờ nên làm kỹ thuật đảo ngược độ sâu này trong các trò chơi hiện đại.

Lưu ý: Jari tạo ra một điểm tốt trên các kiến ​​trúc kết xuất dựa trên gạch (như được tìm thấy trong hầu hết các nền tảng di động). Không xóa độ sâu có thể làm cho mọi thứ khó chịu ở đó quá.


Là tuyên bố cuối cùng của bạn ngụ ý không bao giờ làm bộ đệm sâu xen kẽ hay? Câu trả lời chính xác.
giảm tốc

1
@Daniel Vâng. Tôi đã làm rõ bài viết của mình.
Nicol Bolas

3
Ngoài ra, bỏ qua các kiến ​​trúc binning rõ ràng (như hầu hết các chip OpenGL ES) gây ra sự mất hiệu năng lớn , vì chip đồ họa không thể đưa ra các giả định về trạng thái bộ đệm màu.
Jari Komppa

5

Có, bạn đúng rằng bộ đệm phía sau không bị xóa.

Tại sao là vì (phần lớn) rằng việc sử dụng một shader tùy chỉnh sẽ nhanh hơn các giá trị độ sâu theo hướng ngược lại từng khung hình và dựa vào thực tế là trò chơi của bạn luôn hiển thị mọi pixel trên màn hình.

Vì vậy, với chi phí bằng 0, bạn tiết kiệm được một bộ đệm trong mỗi khung.


1
Tôi không biết về bóng bàn sâu; mỗi công cụ tôi quen thuộc với việc xóa bộ đệm chiều sâu / stprint mỗi khung. Nhưng bên cạnh đó, vâng, nếu trò chơi hiển thị tất cả các pixel (như bình thường), bạn không cần phải xóa bộ đệm màu.
Nathan Reed

Bạn có thể đưa ra một ví dụ cho shader, câu trả lời tốt khác.
giảm tốc

1
Tôi nhận ra rằng bạn đang hỏi về các công cụ gần đây, đọc nhận xét của @ NathanReed là có bao nhiêu công cụ chỉ dành cho PC hoạt động. Xoắn đệm Z là một kỹ thuật cũ hơn, tôi sẽ xem liệu tôi có thể tìm thấy một tài liệu tham khảo không. Các công cụ bảng điều khiển cũng sẽ xóa tất cả các bộ đệm màu, thậm chí một pixel hiển thị hiệu ứng HOM mà Nathan đặt tên sẽ không thành công và buộc nó phải tiếp tục gửi lại.
Patrick Hughes
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.