Tôi đang cấu trúc lại một số phần của công cụ trò chơi mà tôi đang làm việc. Công cụ này được thực hiện trong C # với XNA.
Phần tôi gặp khó khăn là shader / liệu và hàng đợi kết xuất. Trong phiên bản mới, tôi sẽ cung cấp khả năng chỉ ra các trạng thái hiển thị khác nhau trên mỗi lần vượt qua trong một kỹ thuật (trạng thái pha trộn, trạng thái rasterizer, ...). Trong công cụ của tôi, tất cả các kết xuất đều có một vật liệu và mỗi vật liệu được liên kết với một kỹ thuật (do đó với một hoặc nhiều đường chuyền).
Sau này, khi trò chơi sẽ chạy, tôi sẽ thêm các đối tượng có thể kết xuất vào hàng đợi kết xuất và sau đó sắp xếp nó dựa trên đường chuyền được sử dụng bởi mỗi vật liệu. Những gì tôi muốn đạt được là giảm các thay đổi trạng thái giữa các lệnh gọi bằng cách nhóm đầu tiên cùng một lượt và sau đó chuyển với các trạng thái gần giống nhau để đóng càng tốt để giảm thiểu thay đổi. Nhưng giải pháp này dường như có vấn đề khi sử dụng kỹ thuật với nhiều hơn một lần vượt qua với các trạng thái hoàn toàn khác nhau. Các đường chuyền trong cùng một kỹ thuật có thể được tách biệt hoàn toàn trong hàng đợi kết xuất và không được kết xuất lần lượt. Nếu tôi nói rằng đó là vì tôi luôn thấy kỹ thuật nhiều đường chuyền được kết xuất trong một vòng lặp và tất cả các đường chuyền được kết xuất ngay lập tức như thế:
foreach(EffectPass pass in technique.Passes)
{
/* Update parameters */
pass.apply();
graphicsDevice.Draw(...);
}
Nhưng tôi không biết liệu tôi có thể trì hoãn vượt qua kết xuất từ cùng một kỹ thuật thay vì sử dụng lần lượt từng cái như trong ví dụ trước không.
Dưới đây là một ví dụ về những gì có thể sẽ xảy ra với giải pháp tôi cố gắng xây dựng:
- Shader1
- Kỹ thuật
- Pass1 (Bang A)
- Pass2 (bang C)
- Kỹ thuật
- Shader2
- Kỹ thuật
- Pass1 (Bang A)
- Kỹ thuật
- Shader3
- Kỹ thuật
- Pass1 (Bang A)
- Kỹ thuật
Bây giờ tôi có ba mô hình để vẽ, Model1, Model2 và Model3, mỗi mô hình sử dụng một kỹ thuật khác nhau từ danh sách trước đó. Nếu tôi thêm ba mô hình đó vào hàng đợi kết xuất, tôi sẽ kết thúc với hàng đợi kết xuất sau:
-> Đặt trạng thái A -> Vẽ Model1 (Pass1) -> Vẽ Model2 (Pass1) -> Vẽ Model3 (Pass1) -> Đặt trạng thái C -> Vẽ Model1 (Pass2)
Chúng ta có thể thấy rằng Model1 sẽ được rút ra hai lần (hai lần cho Kỹ thuật A) nhưng cuộc gọi rút thăm được phân tách bằng cuộc gọi rút thăm khác.
Tôi không biết làm thế nào để giải quyết điều này. Điều gì sẽ là một giải pháp tốt cho vấn đề này? Làm cách nào tôi có thể thiết kế hàng đợi kết xuất của mình để giảm các thay đổi trạng thái nhiều nhất có thể giữa các lệnh gọi.
BIÊN TẬP:
Sau khi tìm kiếm thêm một chút, tôi đã tìm thấy bài viết hữu ích này: http://realtimecollisiondetection.net/blog/?p=86 . Nó dường như là một cách thanh lịch để sắp xếp đối tượng theo độ sâu và vật liệu. Và trong id vật liệu, tôi có thể có một id pass để sắp xếp cùng một pass sẽ cho phép giảm các thay đổi trạng thái.
Hiện tại trình kết xuất của tôi vẽ các đối tượng trực tiếp trong backbuffer mà không có đèn cũng không có bóng, mọi thứ đều phẳng. Vì vậy, tôi sẽ chỉ lặp qua hàng đợi kết xuất của mình và gọi các phương thức vẽ. Nhưng trong tương lai tôi có thể sẽ thực hiện kết xuất hoãn lại.
Tôi không biết nhiều về nó nhưng tôi biết rằng tôi phải kết xuất các đối tượng của mình trong các mục tiêu kết xuất khác nhau để thu thập thông tin khác nhau (Bộ đệm Z, Bộ đệm thông thường, Bộ đệm G, ...). Tôi giả sử rằng đối với bộ đệm z và bộ đệm thông thường, tôi sẽ sử dụng cùng một shader trên mọi đối tượng cho dù chúng sử dụng vật liệu nào. Nhưng đối với bộ đệm G, tôi sẽ sử dụng các vật liệu của từng đối tượng để điều đó có nghĩa là các shader khác nhau với số lần chuyền khác nhau. Nếu tôi sử dụng giải pháp trong liên kết trước, nếu tôi có một đối tượng có vật liệu cần thực hiện hai lần trở lên, hàng đợi kết xuất của tôi sẽ có ít nhất hai lần đối tượng (một cho mỗi lần vượt qua). Nhưng đối với bộ đệm Z hoặc bộ đệm thông thường không phải là vô dụng khi có cùng một đối tượng nhiều lần?
Những gì tôi thấy là tôi sẽ cần phải có ít nhất hai hàng đợi kết xuất khác nhau: một cho bộ đệm G trong đó một đối tượng có thể nhiều lần tùy thuộc vào số lượng vật liệu yêu cầu và một hàng đợi kết xuất khác cho bộ đệm Z hoặc bộ đệm khác trong đó mỗi đối tượng chỉ một lần. Tôi có đúng không