Sáp nhập hình học / lưới mà không mất lợi ích


11

Trong ba.js, chúng ta có thể hợp nhất hình học để giới hạn số lượng cuộc gọi rút thăm và do đó tăng hiệu suất. Trong một thử nghiệm đơn giản với một vật liệu, tôi có thể vẽ 50.000 khối + bóng @ 60fps trên GPU GTX660 của mình. Không có sự hợp nhất hình học, 5.000 khối đã gây ra một vấn đề.

Tôi tự hỏi làm thế nào để duy trì những lợi ích của việc hiển thị từng lưới khối. Ví dụ, làm thế nào để chọn lưới hình khối khi mọi thứ được hợp nhất thành một hình học? Theo mặc định, điều đó là không thể.

Có bất kỳ kỹ thuật phổ biến cho vấn đề này? Sau tất cả, tôi có tất cả các đối tượng lưới không được trộn lẫn ngay cả sau khi hợp nhất. Vì vậy, phải có một số cách để sử dụng chúng để chọn?

Những gì tôi muốn làm một cách ngắn gọn

  • SimCity thích trò chơi cho mục đích học tập
  • Mỗi ngôi nhà là một khối lưới
  • Muốn kết xuất 50.000 ngôi nhà và có thể thêm và xóa nhà
  • Lựa chọn nhà thông qua con trỏ chuột (chọn) phải có thể

Tôi không chắc liệu nó có hữu dụng với bạn không, nhưng tôi đề cập đến nó cho đầy đủ. Simplygon có một mô hình định giá dựa trên tiền bản quyền cho các nhà phát triển độc lập và có thể thực hiện rất nhiều việc hợp nhất và phân vùng lưới này tại thời điểm thiết kế.
steeveeet

Câu trả lời:


11

Ok tôi hiểu rồi Sau khi hợp nhất toàn bộ hình học lại với nhau, tôi vẫn có các mắt lưới riêng lẻ trong một mảng. Vì vậy, tôi chỉ đơn giản có thể sử dụng các mắt lưới này để phát sóng, mặc dù chúng thậm chí không được hiển thị. Mất một lúc tôi mới nhận ra điều này.

nhập mô tả hình ảnh ở đây

Để chọn, tôi sử dụng triển khai octree này: http://threejs.org/examples/#webgl_octree_raycasting

Điều này làm giảm các bài kiểm tra giao lộ trên mỗi bản cập nhật giảm từ 50.000 xuống ~ 500. Nếu không có octree, khung hình / giây sẽ giảm mạnh.

Vỏ chọn màu cam mà bạn nhìn thấy thực sự là lưới được kết xuất (cuộc gọi rút thăm +1) với vật liệu đã thay đổi và kích thước được sửa đổi.

nhập mô tả hình ảnh ở đây

Vì vậy, tôi đoán bước tiếp theo là thực hiện một số loại phân vùng bản đồ. Đó là, phá vỡ hình học hợp nhất thành nhiều phần. Lý do cho điều này là hình học hợp nhất có một số lượng lớn các đỉnh. Điều đó có nghĩa là nếu tôi di chuyển màn hình tắt 99% bản đồ, card đồ họa vẫn phải xử lý tất cả các đỉnh vì hình học vẫn còn trong tầm nhìn, ít nhất là 1% của nó. Vì vậy, nếu nó bị hỏng, chỉ có các phần trong chế độ xem phải được hiển thị.


Cảm ơn bạn rất nhiều vì cái nhìn sâu sắc này. Tôi đã cố gắng tìm cách để làm điều này là tốt, và tôi nghĩ rằng giải pháp của bạn ở đây là tuyệt vời nhất! Câu hỏi nhanh: Đối với danh sách các đối tượng cục bộ của bạn (ví dụ Three.Object3D), loại thuộc tính nào được yêu cầu để rayCaster.intersectObjects () hoạt động?
AlvinfromDiaspar

Hoàn thành rất tốt.
ClassicThunder

Tôi có một vấn đề tương tự, nhưng bằng cách nào đó không thể có được công việc raycast với r70. Bạn đã làm gì đặc biệt trong khi tạo và hợp nhất các hộp? Tôi sử dụng đoạn mã sau ( pastebin.com/PStaAF3P ) để tạo và hợp nhất các nút, nhưng có lẽ thiếu một cái gì đó để làm cho raycaster hoạt động?
fhahn

Câu hỏi nhanh: Tôi đang làm một cái gì đó rất giống với bạn (bản đồ 3d dựa trên dữ liệu GeoJSON). Với phương pháp của bạn, bất cứ khi nào bạn xoay máy ảnh, bạn cũng cần phải xoay các lưới tòa nhà có sẵn? Hoặc bạn chỉ thêm các hộp riêng lẻ vào cảnh nhưng không hiển thị chúng?
Spencer

@Spencer Không cần phải xoay. Tôi giữ các hộp riêng lẻ trong mảng toàn cầu và chỉ thêm hình học hợp nhất vào cảnh. Sau đó, bạn có thể thực hiện chiếu sóng với đối tượng trong mảng toàn cục, vì raycaster phụ thuộc vào ma trận camera và từng vị trí hộp. Rất có thể không phải là cách tốt nhất, đây chỉ là bằng chứng về khái niệm đối với tôi. Không làm ba.js nữa vào thời điểm này.
dùng990827

1

Để chọn, bạn cũng có thể kết xuất ID của từng khối cho mục tiêu kết xuất khác và chỉ cần kiểm tra giá trị ID ở con trỏ. Lợi ích là việc chọn là pixel hoàn hảo và hoạt động hiệu quả cũng cho hình học phức tạp hơn.

Nếu tất cả các đối tượng có cùng hình dạng, thì bạn có thể sử dụng kết xuất đồ họa. Một luồng định nghĩa hình học, trong khi luồng khác xác định các thuộc tính cho mỗi thể hiện (ví dụ: biến đổi). Để loại bỏ sự bực bội, bạn sẽ cần xây dựng luồng cá thể mỗi khung dựa trên kiểm tra mức độ hiển thị. Nếu bạn có số lượng lớn các đối tượng mặc dù bạn có thể muốn đặt các đối tượng đó vào một quãng tám lỏng lẻo hoặc một cái gì đó để tăng tốc độ loại bỏ.


0

Tôi không chắc chắn về các chi tiết của ba.js, nhưng hai yếu tố hiệu suất có thể xuất hiện trong tâm trí chung về OpenGL:

  1. Bạn đã xem xét việc vận động chưa? Bạn sẽ chỉ cần một cuộc gọi rút thăm và sử dụng ít VRAM.
  2. Bạn đã có một cái nhìn nghiêm túc về các thuật toán chọn? Nếu hình khối của bạn có khối lượng giới hạn trong một danh sách thay vì cây chẳng hạn sẽ giải thích sự khác biệt về độ lớn đó.

0

Một cách tiếp cận khác bạn có thể thực hiện là xây dựng một số thuộc tính đỉnh vào hình học của bạn và đưa logic tô sáng vào trình đổ bóng mảnh của bạn. Điều này cực kỳ hữu ích khi bạn không muốn có hai bản sao dữ liệu trong bộ nhớ và bạn sẽ có nhiều quyền kiểm soát hơn về cách thực hiện tô sáng.

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.