Tôi có nên sử dụng ma trận thế giới?


8

Hình ảnh tham khảo cho câu hỏi:

không gian đối tượng và không gian thế giới

(hình ảnh từ hướng dẫn CG )

API D3D9 đã cho chúng ta sử dụng ma trận thế giới .

Tuy nhiên, nếu bạn sử dụng ma trận thế giới, thì bạn phải thực hiện thêm một ma trận nhân trong shader (kết thúc giống nhau cho toàn bộ nhiều đỉnh).

Do đó, quy ước OpenGL kết hợp mô hình hóa và xem ma trận thành một ma trận (GL_MODELVIEWMATRIX = View * World).

Điều gì tốt hơn, và tại sao?

Câu trả lời:


7

Không. Không bao giờ bạn nên có một ma trận thế giới rõ ràng trong shader của mình.

Một lời giải thích chi tiết về lý do tại sao có thể được tìm thấy ở đây , nhưng phiên bản ngắn thực sự rất đơn giản: bạn không bao giờ cần nó và nó có thể giết chết độ chính xác của dấu phẩy động của bạn.

Nếu không gian thế giới của bạn quá lớn, thì một chiếc máy ảnh ở xa nguồn gốc có thể gây ra các vấn đề chính xác về điểm nổi.

Tất cả không gian thế giới không gì khác hơn là một trung gian giữa không gian mô hình và không gian máy ảnh. Đó là nơi bạn có thể thể hiện camera và tất cả các vật thể khác trong cùng một không gian. Nhưng tất cả những gì bạn sử dụng là để tạo ra ma trận từ máy ảnh đến máy ảnh, sau đó bạn áp dụng cho tất cả các ma trận từ mô hình đến thế giới để tạo ma trận từ mô hình đến máy ảnh.

Bạn có thể xử lý các vấn đề chính xác trong C ++ bằng cách sử dụng gấp đôi thay vì thả nổi cho các tính toán ma trận. Bạn có thể chuyển đổi chúng trở lại phao trước khi tải chúng lên shader.

Vậy tại sao bạn cần một biến đổi không gian thế giới rõ ràng trong shader của bạn? Trong mã nguồn của bạn, có. Nhưng trong shader của bạn? Bạn sẽ làm gì với nó mà bạn không thể làm với không gian máy ảnh?

Ánh sáng có thể được thực hiện trong không gian máy ảnh dễ dàng như không gian thế giới; tất cả những gì bạn phải làm là chuyển đổi vị trí / hướng ánh sáng của bạn thành không gian camera. Xét cho cùng, không gian máy ảnh có cùng quy mô với không gian thế giới. Bạn thực hiện chuyển đổi này một lần trên mỗi khung hình cho mỗi ánh sáng; hầu như không phải là gánh nặng hiệu năng ngay cả trên CPU.

Vì vậy, hoàn toàn không có điểm nào trong việc phơi bày các shader của bạn thành một biến đổi không gian thế giới rõ ràng . Đó chỉ là một bước trung gian mà bạn gấp vào ma trận của mình.


1

Bạn sẽ không làm thêm ma trận nhân lên trong shader của mình. Mẹo nhỏ là bạn thực hiện phép nhân ma trận một lần trên mỗi khung hình trên CPU, sau đó tải kết quả cuối cùng lên trình tạo bóng đỉnh của bạn. Điều đó cung cấp cho bạn một vị trí bằng cách nhân ma trận trên mỗi đỉnh, bất kể bạn có thế giới và xem riêng biệt hay ghép nối.


0

Trong nhiều trường hợp, dù sao bạn cũng muốn có thế giới pos trong shader đỉnh, cho các mục đích khác. Ví dụ, bạn cần tính toán vectơ xem, để chuyển xuống trình đổ bóng pixel để đánh giá đặc điểm.

Ma trận cục bộ-thế giới cũng cần thiết để biến đổi các vectơ tiếp tuyến và vectơ bình thường [1] thành không gian thế giới để tạo bóng, giả sử rằng bạn thực hiện đổ bóng trong không gian thế giới (bạn có thể thực hiện nó trong không gian tiếp tuyến, trong trường hợp bạn cần một tập hợp các ma trận khác nhau).

Vì vậy, IMO, thật hợp lý khi có hai ma trận: địa phương với thế giới và thế giới để quay clip. Cái sau là sản phẩm của ma trận khung nhìn và ma trận chiếu. Truyền cả hai cho shader đỉnh và thực hiện các phép nhân như sau:

posWorld = mul(posLocal, matLocalToWorld)
posClip = mul(posWorld, matWorldToClip)

[1] (Miễn là bạn không có tỷ lệ không đồng nhất. Trong trường hợp đó, các quy tắc phải được chuyển đổi bằng chuyển vị nghịch đảo của ma trận cục bộ với thế giới.)



@NicolBolas: Điểm tốt; có những vấn đề chính xác với bóng trong không gian thế giới. Không có nghĩa là bạn phải sử dụng không gian camera. Trong công việc của tôi, chúng tôi thực sự sử dụng một "không gian thế giới tập trung vào camera" - các trục thẳng hàng với thế giới, xuất phát từ camera. Có các trục thẳng hàng trên thế giới giúp dễ dàng áp dụng các hình khối được lưu trữ trong không gian thế giới.
Nathan Reed
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.