2012-06-04 18 views
9

Tôi đang thực hiện chiếu sáng theo từng đoạn và khi chỉnh sửa vecter bình thường, tôi nhận được mã này: vec3 f_normal = mat3(MVI) * normal; Nơi MVI là: mat4 MVI = transpose(inverse(ModelViewMatrix));. Vì vậy, những gì được trả lại sau khi tuyên bố mat3(MVI)?Câu lệnh mat3 (ma trận mat4) trích xuất trong glsl làm gì?

+2

Vâng, lý do đơn giản (và chỉ là một sự hiểu biết nhỏ về các khái niệm cơ bản về toán học của đồ họa máy tính) ra lệnh rằng đó là phần trên bên trái 3x3. Bên cạnh đó, bằng mọi cách không chuyển đổi và đảo ngược ma trận của bạn trong bóng đổ. Nó không thay đổi mỗi đỉnh và có thể được thực hiện trên CPU (nơi nó không mất nhiều thời gian hơn cho một ma trận đơn). –

Trả lời

11
mat3(MVI) * normal 

Trả về ma trận 3x3 trên từ ma trận 4x4 và nhân bình thường với ma trận 4x4. Ma trận này được gọi là 'ma trận bình thường'. Bạn sử dụng điều này để đưa các tiêu chuẩn của bạn từ không gian thế giới đến không gian mắt. Phần 3x3 trên của ma trận là quan trọng đối với quy mô và luân phiên, trong khi phần còn lại chỉ dành cho bản dịch (và các tiêu chuẩn không bao giờ được dịch)

Để bình thường từ không gian thế giới đến không gian mắt, bạn chỉ cần 3x3 nghịch đảo transpose của ma trận chế độ xem mô hình. Trừ khi ma trận của bạn trong othro bình thường (không có quy mô không thống nhất) trong trường hợp đó ma trận ban đầu là giống như transpose nghịch đảo của nó.

+0

Sử dụng 3x3 trên của ma trận modelview chỉ hoạt động khi không có thang không đồng đều, nếu không bạn phải sử dụng chuyển vị của nghịch đảo của modelview (là ma trận 4x4). Lưu ý rằng bạn phải đặt thành phần w của giá trị bình thường thành 0 khi nhân với ma trận 4x4. –

+0

@racarate chính xác. Tôi sẽ sửa đổi câu trả lời của mình để tránh mọi người hiểu nhầm. –

2

Từ GLSL types: "Không có giới hạn về kích thước khi xây dựng ma trận từ ma trận khác. Vì vậy, bạn có thể tạo ma trận 4x2 từ ma trận 2x4; chỉ các phần tử tương ứng được sao chép".. Vì vậy, bạn nhận được kết quả là 33 submatrix trên cùng bên trái của MVI.

+0

Cảm ơn bạn đã trả lời nhanh, điều đó có ảnh hưởng đến kết quả cuối cùng không? (tại sao nó không sử dụng phần tử thứ tư trong vector chuẩn nhưng loại bỏ một số phần tử trên MVI?) –

+3

Đó là một phép toán chung và không biết gì về ngữ nghĩa của ma trận cơ bản đang được vận hành. –

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