2011-10-12 79 views
5

Gần đây tôi đã bắt đầu phát triển động cơ voxel. Những gì tôi cần chỉ là voxels đầy màu sắc mà không có kết cấu, nhưng với số lượng rất lớn (nhỏ hơn nhiều so với minecraft) - và câu hỏi là làm thế nào để vẽ cảnh rất nhanh? Tôi đang sử dụng C#/xna nhưng đây là ý kiến ​​của tôi không phải là rất quan trọng trong trường hợp này, chúng ta hãy nói về trường hợp chung. Nhìn vào hai trò chơi này:Động cơ và tối ưu hóa Voxel

  1. http://www.youtube.com/watch?v=EKdRri5jSMs
  2. http://www.youtube.com/watch?v=in0bavLJ8KQ

Đặc biệt Tôi nghĩ rằng video số 2 đại diện cho phương pháp tối ưu hóa tuyệt vời (thẻ gfx của tôi bắt đầu nghẹn chỉ tại 192 x 192 x 64) Làm thế nào họ đạt được điều này?

gì tôi sẽ có trong công cụ:

  • voxels đầy màu sắc mà không cần kết cấu, nhưng bóng mờ
    • nhiều, rất nhiều voxels, nói tối thiểu 512 x 512 x 128 để đạt được một cái gì đó như video # 2
    • bóng (bóng mịn sẽ tuyệt vời nhưng không cần thiết)
    • tùy chọn: ánh sáng động (ví dụ: từ quả cầu lửa, ánh sáng lên gần cấu trúc voxel)
    • Framerate tối thiểu 40 FPS
    • camera có 3 cách tự do (di chuyển trong x-trục, di chuyển theo trục y, di chuyển theo trục z), không xoay camera cần
    • tính năng cuối cùng tùy chọn có thể Depth of Field (nó sẽ được ngọt ngào ^^)

tối ưu hóa Những gì tôi đã biết:

  • loại bỏ voxels vô hình mà nằm bên trong cấu trúc voxel (được nêu fr om sáu hướng bởi voxels khác)
    • loại bỏ khuôn mặt vô hình của voxels - bởi vì máy ảnh không có luân chuyển và luôn nhìn xéo về phía trước như trong các trò chơi TPP, vì vậy nếu chúng ta chia màn hình bởi cắt dọc, voxels trái và voxels bên phải sẽ hiển thị chỉ có 3 khuôn mặt
    • giữ voxels trong từ điển thay vì mảng 3 chiều - nhảy qua mảng kích thước 512 x 512 x 128 mất mili giây là không được chấp nhận - nhưng từ điển int: màu trong đó mô tả được đóng gói Vị trí 3D nhanh hơn nhiều
    • sử dụng tính năng instancing nơi applciable
    • kết thúc? (Làm thế nào để làm điều này?)
    • không gian phân chia/octtree (là nó ý tưởng tốt?)

Sẽ rất biết ơn nếu ai đó cho tôi một lời khuyên làm thế nào để cải thiện hiện có tối ưu hóa được liệt kê ở trên hoặc có thể chia sẻ ý tưởng về những cải tiến mới. Cảm ơn

+2

Lưu ý rằng cả hai video đều hiển thị công cụ dường như không hỗ trợ xoay vòng. Ngoài ra, video thứ hai có thể sử dụng biển quảng cáo cho các đối tượng lấy nét ngoài các đối tượng voxel. – Skizz

Trả lời

8

1) Voxatron sử dụng trình kết xuất phần mềm thay vì GPU.Bạn có thể đọc một số chi tiết về nó nếu bạn đọc những ý kiến ​​trong bài viết trên blog này:

http://www.lexaloffle.com/bbs/?tid=201

Tôi đã không nhìn vào chi tiết bản thân mình nên không thể cho bạn biết nhiều hơn thế.

2) Tôi chưa bao giờ chơi 3D Dot Game Heroes nhưng tôi không có lý do gì để tin rằng nó sử dụng voxels cả. Ý tôi là, tôi không thấy bất kỳ hình khối nào được thêm vào hoặc bị xóa. Nhiều khả năng nó chỉ là một lưới đa giác tĩnh với một kết cấu đẹp được áp dụng.

Để tự mình thực hiện, đừng cố gắng vẽ thế giới bằng cách hiển thị hình khối vì điều này rất chậm. Thay vào đó, bạn nên xử lý khối lượng và tạo ra các mắt lưới nằm trên giao điểm của voxels rắn và những cái trống. Chia khối lượng thành các vùng có kích thước phù hợp (ví dụ: 32x32x32) và tạo lưới cho mỗi vùng.

Tôi đã viết một bài viết về điều này mà bạn có thể thấy hữu ích. Nó thực sự là về voxel trơn tru nhưng rất nhiều priciples stll áp dụng.

Bạn có thể đọc nó trên sách Google tại đây: http://books.google.com/books?id=WNfD2u8nIlIC&lpg=PR1&dq=game%20engine%20gems&pg=PA39#v=onepage&q&f=false

Và bạn có thể tìm thấy mã nguồn liên quan ở đây: http://www.thermite3d.org

2

Vì bạn đang sử dụng XNA, bạn chỉ có thể sử dụng instancing để có được hiệu quả mong muốn: http://www.float4x4.net/index.php/2010/06/hardware-instancing-in-xna/ http://roecode.wordpress.com/2008/03/17/xna-framework-gameengine-development-part-19-hardware-instancing-pc-only/

Khái niệm cơ bản là instancing: tính năng này cho phép bạn chỉ định một số lượng dữ liệu lặp lại và một số lượng va chạm thu thập dữ liệu trong một cuộc gọi DrawIndexedPrimitive duy nhất. Trong trường hợp của bạn, luồng cá thể sẽ là một hộp rắn duy nhất và luồng khác sẽ là thông tin biến đổi và màu sắc.