Biểu đồ cảnh cho công cụ kết xuất hoãn lại


10

Như một bài tập học tập, tôi đã viết một công cụ kết xuất hoãn lại. Bây giờ tôi muốn thêm một biểu đồ cảnh vào công cụ này nhưng tôi hơi khó hiểu làm thế nào để làm điều này.

Trên một công cụ bình thường (công cụ kết xuất chuyển tiếp) tôi sẽ chỉ thêm tất cả các mục (Tất cả triển khai IDrawable và IUpdateAble) vào biểu đồ cảnh của mình, trước tiên di chuyển theo chiều rộng của biểu đồ cảnh và gọi Draw () ở mọi nơi.

Tuy nhiên, trong một công cụ kết xuất hoãn lại, tôi phải tách các lệnh gọi. Đầu tiên tôi phải vẽ hình học, sau đó là các bóng đổ và sau đó là đèn (tất cả cho các mục tiêu kết xuất khác nhau), trước khi tôi kết hợp tất cả chúng. Vì vậy, trong trường hợp này, tôi không thể đi qua biểu đồ cảnh và chỉ cần gọi vẽ. Cách tôi nhìn thấy tôi phải di chuyển trên toàn bộ biểu đồ cảnh 3 lần, kiểm tra loại vật thể đó phải được vẽ hoặc tôi phải tạo 3 biểu đồ cảnh riêng biệt được kết nối với nhau. Cả hai giải pháp này có vẻ kém, tôi muốn xử lý các đối tượng cảnh trong suốt hơn.

Một giải pháp khác mà tôi nghĩ là di chuyển qua biểu đồ cảnh như bình thường và thêm các mục vào 3 danh sách riêng biệt, tách hình học, đổ bóng và đèn, sau đó lặp lại các danh sách này để vẽ chính xác, điều này tốt hơn, và nó có tốt hơn không? khôn ngoan để sao chép 3 danh sách mỗi khung?

Câu trả lời:


6

Một cách tiếp cận tôi đã sử dụng trong một dự án C ++ là đồ thị cảnh (có chỉ số không gian) lấp đầy một vectơ std :: hiển thị 'dựa trên sự thất vọng của chế độ xem hiện tại. Danh sách hiển thị này được quản lý bởi biểu đồ cảnh nên chỉ được tính toán lại khi máy ảnh di chuyển - các đối tượng chuyển động trong biểu đồ được di chuyển trong danh sách này và sử dụng bia mộ và danh sách thay đổi chưa được sắp xếp được sắp xếp lại và hợp nhất khi cần.

Danh sách các mục hiển thị được sắp xếp theo ID shader trước và trong từng loại theo khoảng cách từ camera. ID shader được gán sao cho địa hình sắp xếp trước rồi đến các tòa nhà và sau đó là các đơn vị và sau đó là các hạt và sau đó - đó là một RTS. Một số mô hình có nhiều hơn một shader, nhưng chúng chỉ quảng cáo shader chính của chúng. Khi chúng được yêu cầu vẽ, những người cần bit được vẽ bằng một shader khác cũng tự thêm vào danh sách liên kết đơn tiếp theo.

Vì vậy, bản vẽ đi qua mảng có thể nhìn thấy trong một lần và trong đó người ta sẽ vượt qua một danh sách được liên kết của các mục đó để xem lại, và chúng được rút ra một lượt thứ hai, v.v.

Vẽ mặt trước và mặt sau mờ trong suốt giúp giữ mọi thứ lành mạnh.

Điều này có lẽ không giảm thiểu số lượng thay đổi shader, v.v. nhưng nó khá khả thi và dễ thực hiện.

Tôi không biết gì về XNA và mức độ áp dụng của nó và mức độ mà những thứ cấp thấp này bạn tạo ra tôi sợ. Tuy nhiên, sẽ rất thú vị khi biết các cựu chiến binh nghĩ gì về cách tiếp cận này đối với C ++ RTSes.


Này Will, tôi thực sự thích câu trả lời này, đặc biệt bởi vì nó hoàn toàn khác với những gì tôi nghĩ cho đến nay. Phương pháp của bạn có vẻ rất lành mạnh, đặc biệt là khi cũng nghĩ về các đối tượng bán trong suốt (điều mà tôi hầu như chỉ tránh được cho đến nay). Xây dựng một danh sách (được liên kết) từ biểu đồ cảnh của bạn cho các đối tượng truy cập có vẻ như là một ý tưởng rất tốt. Và vâng, trong XNA, chúng tôi cũng phải làm tất cả những thứ cấp thấp này :).
Roy T.

3

Đề xuất của tôi sẽ là cách tiếp cận 2 bước phù hợp với yêu cầu cụ thể của bạn tương tự như những gì bạn mô tả về bản thân. Bạn cần một biểu đồ cảnh và "bộ sưu tập kết xuất" cho mỗi bước kết xuất, trong trường hợp bóng, hình học, ánh sáng của bạn (có thể là thứ tư là các đối tượng trong suốt?)

Biểu đồ cảnh có thể dựa trên bất kỳ loại mối quan hệ nào, nhưng sở thích cá nhân của tôi sẽ dựa trên mối quan hệ không gian nơi mỗi nút có thể chứa các nút khác để tạo điều kiện loại bỏ nhanh.

Các bộ sưu tập kết xuất có thể là bất kỳ loại cấu trúc dữ liệu nào phù hợp với bước cụ thể. Chẳng hạn, bộ sưu tập bóng có thể là một danh sách hoặc cây được sắp xếp theo độ sâu để tối đa hóa việc loại bỏ z sớm. Bộ sưu tập hình học có thể được sắp xếp theo cách sử dụng shader để giảm thiểu thay đổi shader (trạng thái). Bộ sưu tập ánh sáng có thể là một danh sách hoặc cây được sắp xếp theo khoảng cách ánh sáng, kích thước hoặc sự kết hợp của những thứ đó để bạn có thể giới hạn ánh sáng chỉ ở mức ánh sáng hiệu quả nhất nếu hiệu suất là một vấn đề.

Dù bạn chọn cấu trúc dữ liệu nào, hãy đảm bảo thao tác chèn nhanh và đảm bảo rằng nó sử dụng nhóm và các kỹ thuật khác để loại bỏ mọi phân bổ / hủy dữ liệu vì bạn sẽ xóa và điền vào các danh sách này từng khung.

Bây giờ buộc tất cả lại với nhau thật dễ dàng. Chỉ cần đi qua biểu đồ cảnh và thêm từng mục vào (các) bộ sưu tập kết xuất có liên quan. Nó giúp nếu cấu trúc dữ liệu của bạn tự động sắp xếp / cấu trúc các mục mới dựa trên các yêu cầu. Khi bạn hoàn thành, đi qua các bộ sưu tập kết xuất theo thứ tự cần thiết và kết xuất chúng.

Vì cấu trúc dữ liệu của bạn có chèn nhanh và không tạo rác, nên sẽ không bị phạt khi lập lại danh sách như bạn đã đề cập.

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.