Làm cách nào tôi có thể chiếu một cảnh không phù hợp với bộ nhớ?


11

Nếu cảnh bị raytraced không thể được lưu trong bộ nhớ, thì nếu không thêm RAM vào máy thì có vẻ không thực tế để hiển thị trong khoảng thời gian thực tế, do phải tải các phần khác nhau của cảnh từ đĩa có khả năng nhiều lần trên mỗi pixel .

Có cách nào để khắc phục điều này? Tôi đang cố gắng nghĩ ra một số cách thực hiện một số lượng lớn các phép tính liên quan đến một tập hợp con cụ thể của cảnh cùng một lúc, để giảm số lần nó cần được tải vào bộ nhớ. Có cách nào khác để cải thiện tốc độ trong trường hợp như vậy không?

Câu trả lời:


10

Nếu cảnh không hoàn toàn vừa với bộ nhớ, bạn đang bước vào lĩnh vực kết xuất ngoài lõi. Về cơ bản có hai cách tiếp cận ở đây: a) Tạo cảnh của bạn theo yêu cầu b) Tải cảnh của bạn theo yêu cầu

Cách tiếp cận trước đây phù hợp với hầu hết các quy trình hoạt hình, trong đó các mô hình được phân chia rất nhiều bằng cách sử dụng, ví dụ Catmull-Clark và có thể trở nên rất tốn bộ nhớ, nhưng bản thân các lưới cơ sở dễ dàng phù hợp với bộ nhớ. Pixar có một vài bài viết về điều này (ví dụ: Vi sai Ray và Bộ đệm hình học đa biến đối với truy tìm tia phân phối trong các cảnh phức tạp ), nhưng ý chính của nó là các mô hình chỉ được chia nhỏ khi chúng bị tia chiếu và chỉ được chia nhỏ như vậy. hợp lý cho một tia như vậy (ví dụ xen kẽ khuếch tán cần độ chính xác thấp hơn so với phản xạ gương). Phần còn lại được xử lý bởi bộ đệm hình học, giúp giữ các mô hình được chia nhỏ trong bộ nhớ và hy vọng làm cho quá trình hiệu quả bằng một chiến lược đuổi tốt.

Miễn là tất cả các lưới cơ sở của bạn thoải mái phù hợp với bộ nhớ, bạn có thể dễ dàng đi ra khỏi lõi và kết xuất các lưới ở các cấp độ phân chia không bao giờ phù hợp với bộ nhớ. Bộ nhớ cache hình học cũng chia tỷ lệ độc đáo với dung lượng bộ nhớ bạn có, cho phép bạn cân RAM so với thời gian kết xuất. Điều này cũng đã được sử dụng trong Ô tô tôi tin.

Cách tiếp cận thứ hai là tổng quát hơn và không dựa vào việc sử dụng nhiều phân khu. Thay vào đó, nó dựa vào thực tế là cảnh của bạn rất có thể được thực hiện bởi một nghệ sĩ và đã được phân vùng thành các vật thể nhỏ hợp lý phù hợp với từng bộ nhớ. Ý tưởng sau đó là giữ hai cấu trúc phân cấp (kD-tree hoặc phân cấp âm lượng giới hạn): Một hệ thống phân cấp cấp cao nhất chỉ lưu trữ các hộp giới hạn của các đối tượng trong cảnh của bạn và phân cấp cấp thấp lưu trữ hình học thực tế. Có một hệ thống phân cấp cấp thấp như vậy cho mỗi đối tượng.

Trong phương pháp này, lý tưởng nhất là bạn đã lưu trữ một hộp giới hạn cùng với từng đối tượng trên đĩa. Khi cảnh được tải, ban đầu bạn chỉ xây dựng hệ thống phân cấp cấp cao nhất, nghĩa là bạn chỉ phải nhìn vào các hộp giới hạn chứ không phải hình học. Sau đó, bạn bắt đầu truy tìm các tia và đi qua chúng qua hệ thống phân cấp. Bất cứ khi nào một tia chạm vào một nút lá trong hệ thống phân cấp cấp cao nhất (tức là nó chạm vào khung giới hạn của một đối tượng), thì đối tượng đó được tải vào bộ nhớ và hệ thống phân cấp cấp thấp của nó được xây dựng. Các tia sau đó tiếp tục đi xuống truy tìm đối tượng đó. Kết hợp với bộ đệm đối tượng giữ càng nhiều phân cấp cấp thấp trong bộ nhớ càng tốt, điều này có thể thực hiện hợp lý tốt.

Lợi ích đầu tiên của cách tiếp cận như vậy là các vật thể không bao giờ bị bắn không bao giờ được tải, có nghĩa là nó tự động thích nghi với khả năng hiển thị trong cảnh của bạn. Lợi ích thứ hai là nếu bạn truy tìm được nhiều tia, bạn không phải tải một vật ngay lập tức vì nó bị tia chiếu trúng; thay vào đó, bạn có thể giữ tia đó và đợi cho đến khi đủ tia chiếu vào vật thể đó, phân bổ tải trọng qua nhiều lần chiếu tia.

Bạn cũng có thể kết hợp phương pháp này với một thuật toán sắp xếp tia, chẳng hạn như Shading hoãn lại được sắp xếp theo dõi đường dẫn sản xuất để tránh bị đập do các tia không liên tục. Bài báo được đề cập mô tả kiến ​​trúc của trình kết xuất Hyperion của Disney, được sử dụng cho Big Hero 6 tôi tin, vì vậy rất có thể nó có thể xử lý các cảnh ở quy mô sản xuất.


1
Điều này là siêu thú vị! Giấy Disney bạn liên kết cũng vậy.
John Calsbeek

+1 Rất nhiều câu trả lời cho những điều tôi luôn băn khoăn!
Rotem

7

Nếu bạn sắp xếp cảnh của mình theo cấu trúc không gian (cách thông thường là Phân cấp khối lượng giới hạn ), bạn có thể sử dụng một loại cảnh ảo (tôi đang tạo ra thuật ngữ này, liên quan đến kết cấu ảo ).

Một trình quản lý bộ nhớ sẽ chỉ giữ một số lượng giới hạn các hộp giới hạn được tải tại một thời điểm và trừu tượng hóa hoạt động bao gồm lấy một hộp.

Bằng cách này, một hộp sẽ chỉ được tải khi cần thiết: khi một tia chạm vào hộp giới hạn, hộp sẽ được tải để giải quyết va chạm. Sau này khi một hộp khác cần được tải, hộp không sử dụng sẽ bị xóa để nhường chỗ cho hộp mới.

Với tất cả các hộp được tải và xóa, độ kết hợp tia sẽ là một yếu tố chính trong tốc độ. Tôi cho rằng một cải tiến hơn nữa có thể là trì hoãn việc tải, bằng cách sắp xếp lại các tia để xử lý trước các hộp đã được tải.


Có cái gì đó như thế này.
joojaa

1

Những gì bạn làm là bạn tải hình tam giác vào bộ nhớ từ đĩa dựa trên những gì đã được nhấn trước đó. Bạn có thể bắt đầu với hình tam giác ở gần trước. Lý do là trong một khu vực, các tia có khả năng chạm vào các tam giác giống nhau nhiều lần. Và cuối cùng bạn sẽ có phần hiệu quả. (Vì lý do này, bạn nên lưu trữ hình tam giác hit cuối cùng trong theo dõi tắc mà không quan tâm đến trật tự)

Thứ hai, bạn lưu trữ các hình tam giác trong một cây không gian cho phép bạn thực hiện tìm kiếm nhanh từ đĩa, để làm mới những phần bạn đang có trong bộ nhớ gần nhau. Vì vậy, chỉ tải các nhánh sẽ theo cách của tia. Nếu đó là một loại cây voxel, như một octree, bạn thậm chí có thể sắp xếp các tia thứ cấp và giải quyết chúng bằng cách kết hợp. Cây BSP cũng có phần tốt trong việc cắt tỉa các khu vực.

Có những trường hợp điều này không thành công nhưng hiệu quả hợp lý của nó trong hầu hết các thùng cảnh nếu bạn không thể hiện tiếng ồn ...

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.