2011-01-12 18 views
10

Tôi đã muốn viết bộ ghi thời gian thực đa luồng của riêng mình trong C++, nhưng tôi không muốn thực hiện tất cả các vector và ma trận logic với nó. Tôi đã tìm ra một số nghiên cứu để tìm một thư viện tốt cho điều này, nhưng tôi chưa có nhiều thành công ...Muốn viết một raytracer, bị kẹt trên thư viện đại số nào để sử dụng (C++)

Điều quan trọng là việc triển khai nhanh và tốt nhất là phải có giấy phép thân thiện. Tôi đã đọc rằng boost có đại số cơ bản, nhưng tôi không thể tìm thấy bất cứ điều gì về nó tốt như thế nào về tốc độ của nó.

Đối với phần còn lại, Google đã cho tôi Armadillo, tuyên bố rất nhanh và so sánh chính nó với một số thư viện khác mà tôi chưa từng nghe đến.
Sau đó, tôi nhận được Seldon, cũng tuyên bố là hiệu quả và thuận tiện, mặc dù tôi không thể tìm ra chính xác vị trí của chúng trên quy mô.
Cuối cùng tôi đọc về Eigen, mà tôi cũng đã thấy được đề cập ở đây trên StackOverflow trong khi tìm kiếm ở đây.

Trong bài giảng CG tại trường đại học của tôi, họ sử dụng HLSL cho đại số (làm cho các sinh viên thực hiện/tối ưu hóa các bộ phận của raytracer), mà tôi đã suy nghĩ hay không tôi có thể sử dụng GLSL cho việc này. Một lần nữa, tôi không có ý tưởng lựa chọn nào là hiệu quả nhất, hoặc sự đồng thuận chung là gì trên các thư viện đại số. Tôi đã hy vọng như vậy có thể giúp tôi ra đây, vì vậy tôi có thể bắt đầu với một số phát triển thực sự :)

PS: tôi đã cố gắng liên kết đến các trang web, nhưng tôi không có đủ diện chưa

+1

Tôi rất muốn giới thiệu ompf.org (http://ompf.org) các diễn đàn của họ được lấp đầy với một số trình phát tia nhanh nhất hiện có. Và nhiều người trong số họ bao gồm thông tin chi tiết về cách họ làm việc. –

Trả lời

12

tôi khuyên bạn nên viết thói quen của riêng bạn. Khi tôi đã viết raytracer của tôi, tôi thấy rằng hầu hết các đại số sử dụng cùng một bộ sưu tập nhỏ các phương pháp. Về cơ bản tất cả những gì bạn cần là một lớp vectơ hỗ trợ cộng, trừ, vv Và từ đó tất cả những gì bạn thực sự cần là Dot và Cross.

Và thành thực sử dụng GLSL sẽ không cung cấp cho bạn nhiều hơn thế nữa (chúng chỉ hỗ trợ dấu chấm, thập giá và toán học vector đơn giản, mọi thứ khác phải được mã hóa bằng tay). Tôi cũng khuyên bạn nên tạo mẫu trong C++ sau đó chuyển sang CUDA sau đó. Rất khó để gỡ lỗi mã GPU, vì vậy bạn có thể làm cho nó hoạt động trong CPU sau đó recode nó một chút để làm việc trong CUDA.

Trong raytracers thực tế khá đơn giản. Nó làm cho chúng nhanh đến mức khó. Đó là cấu trúc tăng tốc sẽ chiếm hầu hết thời gian và tối ưu hóa của bạn. Ít nhất là nó đã làm cho tôi.

+0

Bạn đã viết thói quen giao cắt tia đối tượng của riêng mình hay là có thư viện có thể xử lý việc này không? –

+0

Đây chính xác là loại câu trả lời tôi đang tìm kiếm, cảm ơn! – robrene

+0

Tôi đã viết của riêng mình. Và nó không khó. Tôi bắt đầu với một lực lượng vũ phu, hình tam giác chỉ raytracer. Tôi đã viết một nhà xuất khẩu từ Blender sẽ xuất khẩu bất kỳ đối tượng nào như một danh sách các hình tam giác. Sau đó, v1 của raytracer chỉ cần làm ray-> tam giác giao nhau. Sau đó tôi thực hiện một cây BVH. Về cơ bản bạn lấy các nhóm tam giác và bọc chúng thành các hình khối. Khối được bao bọc thành nhiều hình khối hơn. Từ đó bạn chỉ cần thực hiện kiểm tra giao cắt khối lập phương và tiếp tục đi xuống cây cho đến khi bạn chạm vào một hình tam giác. –

0

Đối với các dự án của tôi, tôi đã sử dụng glm, có thể nó cũng phù hợp với bạn.

Lưu ý rằng các thư viện như boost::ublas hoặc seldon có thể không phù hợp với bạn, vì chúng là định hướng BLAS (và tôi cho rằng bạn đang tìm kiếm thư viện đại số tuyến tính 3D định hướng tốt).

Ngoài ra, thư viện DirectX dxmath khá tốt, mặc dù đôi khi khó sử dụng, vì đó là kiểu tương thích với C.

0

Bạn có thể nhìn vào các mã nguồn cho POVRAY

+3

PoVRay không chính xác là một ví dụ sáng của một codebase C++, phải không? –

2

Bạn nên nhìn vào http://ompf.org/forum/

diễn đàn này xử lý của thời gian thực raytracing, chủ yếu là trong C++. Nó sẽ cung cấp cho bạn con trỏ, và nguồn mẫu.

Hầu hết thời gian, như mọi tính chu kỳ, người ta không dựa vào libs toán vector bên ngoài: tối ưu hóa phụ thuộc vào trình biên dịch bạn đang sử dụng, nội tuyến, sử dụng SSE (hoặc kindof) hay không vv

+1

URL đó không còn hợp lệ, sử dụng URL này cho OMPF2: http://ompf2.com/index.php – bjorke

1

Tôi khuyên bạn nên "IlmBase" là một phần của gói OpenEXR. Nó được viết bằng C++, được phát triển bởi ILM và được sử dụng rộng rãi bởi những người chuyên nghiệp viết và sử dụng phần mềm đồ họa.

Các vấn đề liên quan