Có thể xây dựng một khối lập phương có ít hơn 24 đỉnh không


14

Tôi có một thế giới dựa trên khối lập phương như Minecraft và tôi tự hỏi liệu có cách nào để xây dựng một khối lập phương có ít hơn 24 đỉnh để tôi có thể giảm mức sử dụng bộ nhớ hay không.

Tôi dường như không thể vì 2 lý do: các quy tắc sẽ không xuất hiện đúng và kết cấu trên khuôn mặt sẽ không hoạt động.

Đây là trường hợp hay tôi sai? Có lẽ có một số công nghệ DX11 mới lạ có thể giúp đỡ?

Chỉnh sửa: Chỉ cần làm rõ, tôi có 2 yêu cầu: Tôi cần quy tắc bề mặt cho mỗi mặt khối để làm ánh sáng phù hợp và tôi cần một cách để giải quyết một chỉ mục khác nhau trong một mảng kết cấu cho mỗi mặt khối


1
Bạn có muốn giảm mức sử dụng bộ nhớ card đồ họa hoặc sử dụng RAM không?
doppelgreener

1
Dữ liệu đỉnh được lưu trữ trong RAM và trên GPU ngay bây giờ, vì vậy việc giảm nó sẽ làm giảm cả hai.
Telanor

Câu trả lời:


9

Nếu bạn chỉ cần quy tắc cho mỗi khuôn mặt và nếu texcoords của bạn cho khuôn mặt hoàn toàn 0/0, 0/1, 1/0, 1/1 (hoặc tương tự để phù hợp với bố cục của bạn) thì bạn có thể xây dựng một khối lập phương với 8 câu. và 30 (dải với khởi động lại) hoặc 36 (danh sách) chỉ mục. Tìm nạp các quy tắc và texcoords bằng cách sử dụng tra cứu mảng không đổi dựa trên SV_VertexID trong trình tạo bóng đỉnh của bạn.

Làm điều này có nghĩa là bạn thậm chí không cần đưa texcoords hoặc quy tắc vào bộ đệm đỉnh của mình, điều này sẽ giúp bạn tiết kiệm bộ nhớ nhiều hơn.

Đi xa hơn, bạn vẫn có thể đi hết 24 câu trên mỗi khối nhưng cũng có thể sử dụng tính năng. Mỗi khối sẽ là một kích thước cố định trong bộ đệm đỉnh của bạn (1x1x1) và bạn sẽ có một hệ số tỷ lệ và vị trí (giả sử các hình khối của bạn không xoay, một ma trận nếu chúng làm) như dữ liệu theo từng trường hợp. Trong trường hợp không quay, bạn có chi phí một lần là 24 câu, nhưng sau đó mỗi khối chỉ cần 6 phao để chỉ định đầy đủ. Trong trường hợp xoay, bạn đang nhìn vào 16 phao, nhưng thậm chí đó là một sự tiết kiệm đáng kể (bạn có nhiều khả năng làm tắc nghẽn phía CPU trong các biến đổi ma trận trong trường hợp này - đối với trường hợp không quay đang xây dựng ma trận khi đang bay shader đỉnh của bạn - ngay cả khi nó được thực hiện trên mỗi đỉnh, nhanh đến mức ngu ngốc đến mức bạn thậm chí không cần phải lo lắng về nó).

Đối với kết cấu trên mỗi mặt, chỉ cần sử dụng một mảng kết cấu. Tất nhiên, bạn cần đảm bảo rằng mỗi kết cấu như vậy trong mảng có cùng kích thước và bạn vẫn sẽ cần phải phá vỡ lô hiện tại của mình nếu mảng đó cần thay đổi, nhưng nếu không thì nó sẽ hoạt động tốt. Thêm một texcoord thứ ba vào định nghĩa đỉnh của bạn, định nghĩa lát mảng sẽ sử dụng cho mỗi mặt.

Bạn không cần một GS với cái này, và nó sẽ chạy nhanh hơn so với sử dụng một cái vì khi bật trình tạo bóng hình học sẽ áp đặt thêm chi phí cho chính nó.

Tôi đã mã điểm chuẩn trong công cụ của mình, chỉ cần vẽ một loạt các khối bằng phương pháp này và tôi có thể dễ dàng nhai hơn 300.000 khối trong khi vẫn xóa 60fps, trên GPU tương đối thấp và không phải làm gì khác để tối ưu hóa quy trình . Phải thừa nhận rằng tôi không chiếu sáng cũng không kết cấu chúng, nhưng tôi đã bật chức năng hòa trộn alpha, loại bỏ backface và nói chung nó cân bằng với phần "không làm gì khác để tối ưu hóa", vì vậy nó sẽ cho bạn ý tưởng hợp lý về loại sân bóng bạn có thể đánh bằng phương pháp này.


1
Tôi đã sử dụng instaging trước đây và nó hoạt động tuyệt vời cho các khối dưới 40k. Nhưng tôi có ít nhất 256 nghìn khối và việc xử lý cũng không xử lý được. Mặc dù vậy, sử dụng SV_VertexID với một tra cứu nghe có vẻ rất hứa hẹn.
Telanor

Làm thế nào lớn là bộ đệm cho mỗi trường hợp của bạn? Cố gắng nhét tất cả chúng vào một bộ đệm lớn có thể sẽ khiến GPU của bạn bị nghẹt thở; Tôi thường giữ các bộ đệm cho mỗi trường hợp ở đủ không gian cho các đối tượng 64k (tách các lệnh gọi vẽ nếu cần thiết), sử dụng mẫu loại bỏ / không ghi đè và ghi trực tiếp vào con trỏ được ánh xạ thay vì sao chép từ một mảng trung gian, hoạt động rất tốt .
Maximus Minimus

Ngoài ra - giữ số lượng bản đồ thấp là điều cần thiết. Bản đồ / ghi một khối / unmap 40k lần sẽ chậm hơn nhiều so với bản đồ / ghi 40k khối / unmap chỉ một lần. Nếu bạn đang làm cái trước hãy thử chuyển sang cái sau.
Maximus Minimus

15

Tôi nghĩ rằng tối ưu hóa chính bạn có thể thực hiện, dựa trên thực tế là không phải mọi khối lập phương sẽ thực sự cần tất cả 24 đỉnh . Trên thực tế, các khối duy nhất cần 24 đỉnh là những khối nổi giữa không trung, đây có lẽ là một trường hợp hiếm gặp.

Nói chung, chỉ tạo ra các hình tứ giác cho các mặt tiếp xúc với không khí . Điều này có nghĩa là nếu hai hình khối chạm vào nhau, bạn không cần tạo bất kỳ đỉnh nào cho khuôn mặt mà chúng chạm vào.

Hình ảnh dưới đây thể hiện khái niệm này, nhưng ở dạng 2D để dễ hiểu hơn. Trong ảnh có 11 khối chiếm (được biểu thị bằng các vòng tròn màu xám đầy), thông thường sẽ yêu cầu 4 x 11 = 44 cạnh để thể hiện (4 vì đó là hình vuông, không phải hình khối). Nhưng như bạn có thể thấy, bạn chỉ thực sự cần vẽ các cạnh khi chúng tiếp xúc với một hình vuông trống, trong trường hợp này, chỉ có 8 cạnh.

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

Nếu một ví dụ đơn giản như vậy trong 2D được quản lý để giảm 44 cạnh xuống 8 cạnh, hãy tưởng tượng mức tăng trong một thế giới 3D rộng lớn ...

Đây là cách tiếp cận được mô tả trong bài viết này , tôi khuyên bạn nên đọc, mặc dù được nhắm đến OpenGL. Các khái niệm nên khá phổ quát mặc dù.

Bạn cũng có thể sử dụng trình tạo bóng hình học để tạo các đỉnh một cách nhanh chóng trên GPU, loại bỏ nhu cầu lưu trữ chúng trong bộ nhớ, nhưng tôi không có kinh nghiệm về điều đó, tôi cũng không biết nó sẽ hoạt động tốt như thế nào đối với một lượng lớn thế giới.


1
Bài viết rất thú vị. Tôi đang thực hiện tối ưu hóa cạnh, điều này chắc chắn sẽ giúp rất nhiều. Tôi sẽ cho các shader hình học thử và xem nếu nó hoạt động.
Telanor

Bạn có nghĩa là, sử dụng shader hình học và sản phẩm chéo để tính toán thông thường? Tôi đã nghĩ đến việc sử dụng nó, giống như tạo một chương trình riêng cho các bề mặt phẳng (tôi không quan tâm đến kết cấu).
dreta

@dreta Không chỉ vậy, mà đi đến điểm bạn chỉ gửi các khối lập phương như một danh sách điểm và tất cả các đỉnh được phát ra bởi GS. Có lẽ mã hóa một số thông tin lân cận vào các điểm để trình tạo bóng chỉ tạo ra các khuôn mặt thực sự cần thiết, mặc dù tôi không nghĩ làm thế nào.
David Gouveia

Nếu đó là hiệu suất bạn muốn, đừng sử dụng trình tạo bóng hình học ... Hầu như không bao giờ. Họ hoàn toàn làm hỏng đường ống. Nếu bạn muốn tạo hình học trên GPU, hãy sử dụng trình đổ bóng tính toán hoặc openCL
Robert Fraser
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.