Tại sao các pixel shader không cho chúng ta đọc trực tiếp từ bộ đệm khung hoặc bộ đệm sâu?


18

Để tôi lấy mẫu bộ đệm khung hoặc bộ tạo độ sâu trong trình đổ bóng pixel sẽ là một tính năng cực kỳ hữu ích. Thậm chí chỉ cần có thể biết độ sâu hoặc màu sắc của bất cứ thứ gì đằng sau pixel hiện tại cũng sẽ hữu ích.

Tại sao cả OpenGL và DirectX không cho phép tôi làm điều này? Tôi đã hy vọng sẽ có một số loại giới hạn phần cứng, nhưng pha trộn alpha sử dụng màu trong bộ đệm khung để tính toán pha trộn, và Z-test lấy mẫu bộ đệm độ sâu tại vị trí hiện tại. Tại sao không chỉ phơi bày những giá trị này cho chúng tôi trực tiếp? Tôi có thể hy vọng nhìn thấy điều này trong tương lai?

Câu trả lời:


20

Đó một hạn chế phần cứng. Shader mảnh là một phần của đường ống có thể lập trình, nhưng pha trộn màu cuối cùng với (các) bộ đệm đích không thể lập trình được trong phần cứng hàng hóa / có sẵn rộng rãi tại thời điểm này (có thể định cấu hình qua các trạng thái pha trộn, nhưng bạn không thể viết tùy ý mã thay thế các hoạt động pha trộn tích hợp GPU).

Lý do phần cứng không được xây dựng cho điều này có lẽ phải liên quan đến thực tế là GPU song song ồ ạt; họ xử lý nhiều mảnh vỡ cùng một lúc. Một số mảnh vỡ cuối cùng có thể tương tác với nhau trong bộ đệm đích, nhưng do tính chất không đồng bộ của xử lý mảnh vỡ, không thể biết được cho đến khi mảnh được xử lý và màu cuối cùng được phát ra ... Luôn luôn xảy ra tất yếu.

Chỉ vì pixel A sẽ đứng sau pixel B trong khung cuối cùng không có nghĩa là pixel A sẽ luôn hoàn thành quá trình xử lý đoạn và được ghi đến đích trước B, đặc biệt là trên nhiều khung hình hiển thị. Vì vậy, giá trị được đọc từ bộ đệm đích trong quá trình xử lý của pixel B sẽ không phải luôn là pixel A - đôi khi nó sẽ là các giá trị rõ ràng.

Vì vậy, tôi nghi ngờ rằng việc không cho phép đọc bộ đệm đích trực tiếp trong giai đoạn phân đoạn có liên quan nhiều hơn đến việc ngăn chặn lập trình viên đổ bóng tự bắn vào chân mình bằng cách nhận được kết quả không xác định từ việc đọc đó so với bất kỳ giới hạn kỹ thuật thực tế nào trong việc tạo ra giai đoạn pha trộn hoàn toàn - lập trình. Bằng cách giữ cho các hoạt động đọc được kiểm soát chặt chẽ (ví dụ kiểm tra độ sâu), GPU đảm bảo rằng các hoạt động được thực hiện với giá trị đọc có ý nghĩa nhất định.

Điều đó nói rằng, cũng có thể có một điều chi phí / lợi ích đang diễn ra. Làm cho khía cạnh đó của đường ống GPU được lập trình sẽ phần nào làm phức tạp thiết kế chip và nhu cầu / nhu cầu đọc bộ đệm đích tương đối thấp so với các tính năng khác.


Chỉ để mở rộng về điều này, lý do lịch sử tại sao truy cập bộ đệm khung bị chậm là vì các hướng dẫn rất nặng nề. Việc truy cập vào một pixel bộ đệm khung nhất định sẽ liên quan đến việc trì hoãn đường ống hiện tại cho đến khi tất cả các đường ống khác được tuôn ra để hoàn thành bất kỳ kết xuất nào có liên quan đến pixel được truy vấn. Ngay cả trong trường hợp kỳ lạ của GPU hoàn toàn không song song, bạn vẫn sẽ xóa toàn bộ đường ống cho mỗi truy vấn, đây chỉ là một ý tưởng tồi. Không có nghi ngờ gì mọi thứ là một chút khác nhau trong thế giới của phần cứng lập trình bây giờ nhưng tôi mong đợi một nguyên tắc tương tự được áp dụng.
Kylotan

4

Mặc dù khó chịu, nó cho phép các nhà sản xuất phần cứng linh hoạt để tối ưu hóa quá trình kết xuất theo nhiều cách và minh bạch.

Ví dụ, phần cứng PowerVR (chắc chắn được sử dụng để quay lại trong ngày, không được sử dụng trong một thời gian dài) chờ cho đến khi toàn bộ cảnh được hiển thị, sau đó thực hiện sắp xếp độ sâu tự động bằng thuật toán họa sĩ và không thực sự cần phải tạo độ sâu đệm. Nó sẽ chia màn hình thành các ô và lần lượt hiển thị từng ô.


4

Trình đổ bóng pixel không thể đọc từ bộ đệm màu và độ sâu vì:

Điểm ảnh A và B có thể được tô đậm tại cùng một thời điểm trong phần cứng, mặc dù B cuối cùng sẽ hiển thị trên đỉnh ("sau") pixel A.

Nếu bạn tạo ra nó để phần cứng được đảm bảo phủ bóng A trước B, thì các phần của phần cứng sẽ không làm gì trong khi A bị bóng mờ, và sau đó các phần của phần cứng sẽ không làm gì trong khi B bị bóng mờ.

Trong trường hợp xấu nhất có thể tưởng tượng, tất cả các pixel bạn tạo bóng chồng lên nhau và hàng ngàn trên hàng ngàn luồng GPU - tất cả ngoại trừ một - không hoạt động. Chủ đề này kiên nhẫn tô màu pixel A, rồi B, rồi C ...

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.