Tối ưu hóa lưới cho cảnh quan khối voxel


12

Chơi xung quanh với việc tạo cảnh quan thế giới minecraftish / lego trong Unity 3D (phong cảnh voxel được tạo theo thủ tục với các hình khối), tôi thấy rằng các lưới được tạo cho các cảnh quan này chiếm rất nhiều bộ nhớ. Lưới hiện chỉ bao gồm các đỉnh cho các mặt có thể nhìn thấy của một khối. Việc sử dụng bộ nhớ cho một địa hình phức tạp có thể mất 6 hoặc 7 trăm megs.

Những mắt lưới này có thể được tối ưu hóa, nhưng tôi đang vật lộn để tìm ra một thuật toán phù hợp để làm điều này.

Thuật toán phải tính đến việc bạn không muốn "hợp nhất" các khối có các loại địa hình khác nhau. Tôi đoán một khởi đầu thực sự đơn giản có thể là chỉ xử lý tất cả các khối dọc theo một trục và thực hiện quét thêm cho hai trục còn lại.

Tôi cần phải giữ hình dạng lưới, đó là không có sự hợp nhất của các đỉnh đến điểm mà không gian trống hoặc rắn được thay đổi. Lý do là, có thể có những sinh vật / vv vẫn cần điều hướng xung quanh lưới. Vì vậy, tôi không thể tạo ra một chi tiết thực sự thấp, lưới bị méo.

Bất kỳ suy nghĩ / đề xuất / lời khuyên về điều này?


2
Tại sao bạn lưu trữ các đỉnh cho một khối kích thước đã biết? Làm điều đó theo thuật toán; hoặc sử dụng bộ đệm đỉnh chia sẻ.
giảm tốc

Tại sao lưới đa giác? Voxel có thể được kết xuất khá hiệu quả giống như chúng . Đối với một khối voxel Bạn cần 3 phao (x, y, z), cho 1 hộp Bạn cần khoảng 8 * 3 phao (8 đỉnh), và trong trường hợp Bạn có các cạnh và đa giác ẩn. Có lẽ Unity không phải là công cụ cho vấn đề voxel này.
dùng712092

Câu trả lời:


5

Câu hỏi của tôi là:

Tại sao bạn cần lưới để thực hiện chuyển động sinh vật?

Bạn có thể thực hiện phép tính đường dẫn trên ma trận 3d của id không?

Tôi nghĩ Minecraft sử dụng ma trận 3d với khối pr 4 bit. Nó cũng chỉ mô phỏng các sinh vật một bán kính nhất định xung quanh người chơi.

Bạn có thể lưu trữ các khối của bạn trong một cấu trúc cây oc, trong đó mỗi khối được nén.

Nếu bạn giữ dữ liệu nén trong RAM, bạn có thể giải nén dữ liệu khá nhanh khi cần.

văn bản thay thế


Tôi đã dựa vào việc có lưới để phát hiện va chạm với Unity, nhưng không có gì ngăn tôi chỉ kiểm tra va chạm / đường dẫn chống lại cấu trúc dữ liệu tùy chỉnh. Tuy nhiên, tôi vẫn cần tạo một lưới có thể nhìn thấy để hiển thị địa hình và đây là những gì tôi cần để tối ưu hóa.
James Livingston

Một điểm khác ... như bạn có thể thấy trong ảnh chụp màn hình ... không có nhiều địa hình bằng phẳng này. Các mắt lưới thường là các bề mặt thô ráp của hình khối, nhưng tôi nghĩ có một số chỗ để tối ưu hóa các mặt / đỉnh của lưới. Có vẻ như một quãng tám sẽ là tốt nhất cho dữ liệu có nhiều khối dữ liệu tương tự, thay vì dữ liệu "lởm chởm". Hay điều này không đúng?
James Livingston

@Gatorfrog: Hãy nhớ rằng, không gian trống cũng là một dữ liệu. Nếu nó lởm chởm thì chắc chắn, sẽ có rất nhiều bit báo hiệu sự trống rỗng của nó. Octree chỉ ở đó để bạn tìm ra khối nào bạn nên giải nén trước khi kết xuất chúng. Không gian trống sẽ chỉ là một loạt các số không. Dayjob của tôi liên quan đến việc làm việc với một thư viện kết xuất voxel rất tinh vi. Bài tiếp theo của tôi sẽ mô tả những gì họ làm.
Thợ làm móng

Thư viện tôi làm việc như sau: Tạo khối dữ liệu và lưu trữ chúng trong cơ sở dữ liệu tệp phẳng. Mỗi đoạn có một id. Mỗi khối bao gồm nhiều khối. Đối với mỗi đoạn được tạo ra một số mức độ chi tiết nhất định. Trong đó mức độ chi tiết cao nhất có 100% các voxels, mức cao thứ hai có 25% của tất cả các voxels và sau đó chia cho tất cả 4 cấp độ cho mỗi cấp độ tiếp theo. Chun gần với bạn có thể được hình dung bằng cách sử dụng mức độ chi tiết cao nhất.
Thợ làm móng

tất cả dữ liệu được chuyển dưới dạng nén từ RAM sang VRAM, nơi nó được thổi phồng bởi các thuật toán nén GPGPU chạy trong CUDA. Điều này tiết kiệm rất nhiều băng thông bộ nhớ. Vì vậy: Hãy kiểm tra xem người chơi đang ở đâu và có được các khối chi tiết cao ở đó, những thứ xa nhất có thể dễ dàng được hình dung bằng cách sử dụng một trong các LOD thấp hơn.
Thợ làm móng

1

Làm thế nào về việc sử dụng một octree để lưu trữ địa hình?

Ví dụ: air = no node, tất cả các loại địa hình khác sẽ có một nút với loại địa hình.

Khi chèn / xóa các nút, bạn có thể kiểm tra xem tất cả tám con của mỗi nút trên đường dẫn cây đã sửa đổi có cùng loại terain và hợp nhất chúng nếu cần. Theo cách đó, các khối lớn của cùng một vật liệu sẽ chỉ chiếm một nút.


0

Bạn chỉ tạo các hình khối cho các phần của hình học mà người chơi có thể nhìn thấy? Đó sẽ là bước đầu tiên của tôi. Tùy thuộc vào kích thước địa hình của bạn, bạn không cần phải có toàn bộ thế giới được tải / vẽ / nhìn thấy / bất cứ điều gì.


Tôi chỉ tạo lưới cho các mặt của hình khối có không khí trống bên cạnh chúng. Theo như không vẽ các mắt lưới mà người chơi không thể nhìn thấy ... Tôi nghĩ về việc loại trừ bất kỳ khối nào không có bất kỳ khối có thể nhìn thấy nào, chẳng hạn như các hang động ngầm hoặc các lỗ dẫn xuống đất ở một góc. Mặc dù vậy, tôi chắc chắn sẽ không thể dựa vào các mắt lưới của mình để va chạm / đi vào thời điểm đó.
James Livingston
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.