Tôi đang phát triển ứng dụng OpenGL 2.1 sử dụng trình đổ bóng và tôi đang gặp sự cố với ánh sáng từng đoạn của mình. Ánh sáng là chính xác khi cảnh của tôi nạp ban đầu, nhưng khi tôi di chuyển xung quanh hiện trường, ánh sáng di chuyển xung quanh với "máy ảnh", thay vì ở trong một vị trí tĩnh. Ví dụ, nếu tôi đặt ánh sáng của tôi ra bên phải, phía bên phải của các đối tượng sẽ được chiếu sáng. Nếu sau đó tôi di chuyển camera sang phía bên kia của đối tượng và hướng theo hướng ngược lại, ánh sáng vẫn ở phía bên phải của đối tượng (thay vì ở bên trái, như bây giờ). Tôi cho rằng tôi tính toán ánh sáng trong hệ tọa độ sai, và điều này gây ra hành vi sai. Tôi đang tính toán chiếu sáng theo cách sau ...hệ thống tọa độ chiếu sáng theo từng đoạn
Trong vertex ...
ECPosition = gl_ModelViewMatrix * gl_Vertex;
WCNormal = gl_NormalMatrix * vertexNormal;
nơi vertexNormal là bình thường trong không gian đối tượng/mô hình.
Trong shader đoạn ...
float lightIntensity = 0.2; //ambient
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse
nơi LightPosition là, ví dụ, (100,0, 10.0, 0.0), trong đó sẽ đưa ánh sáng vào phía bên phải của thế giới như mô tả ở trên. Phần mà tôi không chắc chắn, là phần gl_NormalMatrix. Tôi không chắc chắn chính xác ma trận này là gì và không gian tọa độ nào nó đặt bình thường của tôi vào (tôi giả sử không gian thế giới). Nếu bình thường được đưa vào không gian thế giới, thì tôi đã tìm ra vấn đề là ECPosition nằm trong không gian mắt trong khi LightPosition và WCNormal đang ở trong không gian thế giới. Một cái gì đó về điều này không có vẻ đúng nhưng tôi không thể tìm ra nó. Tôi cũng đã cố gắng đưa ECPosition vào không gian thế giới, nhân nó với mô hình riêng của mìnhMatrix chỉ chứa các phép biến đổi mà tôi thực hiện để đưa tọa độ vào không gian thế giới, nhưng điều này không hiệu quả. Hãy cho tôi biết nếu tôi cần cung cấp thông tin khác về trình đổ bóng hoặc mã của tôi.
hướng dẫn tốt về gl_NormalMatrix. Tôi hiểu điều đó bây giờ. Tôi sẽ thử biến LightPosition của tôi thành không gian mắt và xem điều gì xảy ra. Tốt suggesstion. – Nitrex88
yea đã hoạt động! Làm cho tinh thần ... cảm ơn bạn đời! – Nitrex88