2010-11-17 81 views
25

Tôi đang cố gắng sử dụng Ngôn ngữ bóng mờ OpenGL (GLSL) phiên bản 1.5 để tạo các hình đổ bóng và hình học.Làm thế nào để bạn có được ma trận modelview và chiếu trong OpenGL?

Tôi đã biết rằng trong phiên bản GLSL 1.5, các biến tích hợp như gl_ModelViewProjectionMatrix không còn được dùng nữa nên bạn phải chuyển chúng theo cách thủ công. Nếu tôi đã đặt ma trận modelview và chiếu (ví dụ: sử dụng gluLookAtgluPerspective) thì làm cách nào để tôi nhận được ma trận để chuyển vào các hình bóng và hình mờ? Tôi đã thực hiện một số tìm kiếm và một số trang web dường như đề cập đến một hàm glGetMatrix(), nhưng tôi không thể tìm thấy hàm đó trong bất kỳ tài liệu chính thức nào và dường như không tồn tại trong quá trình triển khai tôi đang sử dụng (tôi nhận được lỗi biên dịch unknown identifier: glGetMatrix khi tôi cố gắng biên dịch nó với hàm đó).

Trả lời

56

Này, chúng ta hãy chậm lại một chút ở đây :) Vâng, đó là sự thật mà bạn nhận được ma trận bởi glGetFloatv(GL_MODELVIEW_MATRIX, ptr). .. Nhưng đó chắc chắn không phải là điều bạn nên làm ở đây!

Hãy để tôi giải thích:

Trong GLSL, được xây dựng trong các biến như gl_ModelViewProjectionMatrix hoặc các chức năng như ftransform() đang bị phản đối - đó là đúng, nhưng đó là chỉ vì toàn bộ ma trận chồng bị phản đối ở GL 3.x và bạn có nghĩa vụ phải sử dụng ngăn xếp ma trận của riêng bạn (hoặc sử dụng bất kỳ giải pháp nào khác, ngăn xếp ma trận hữu ích nhưng không bắt buộc!).

Nếu bạn vẫn đang sử dụng ngăn xếp ma trận, thì bạn đang dựa vào chức năng từ OpenGL 2.x hoặc 1.x. Đó là okay vì tất cả điều này vẫn được hỗ trợ trên card đồ họa hiện đại vì hồ sơ tương thích GL - nó là tốt để chuyển sang một phiên bản GL mới, nhưng bạn có thể ở lại với điều này cho bây giờ.

Nhưng nếu bạn đang sử dụng phiên bản OpenGL cũ hơn (với ngăn xếp ma trận), cũng sử dụng phiên bản GLSL cũ hơn. Hãy thử 1,2, vì các phiên bản cao hơn (bao gồm 1,5) được thiết kế tương thích với OpenGL3, nơi những thứ như ma trận chiếu hoặc ma trận modelview không còn tồn tại trong OpenGL và được mong đợi được chuyển một cách rõ ràng như các biến số tùy chỉnh, do người dùng định nghĩa uniform .

Sự tương ứng giữa OpenGL và GLSL phiên bản đã từng là một chút khôn lanh (trước khi họ dọn dẹp các phiên bản đánh số để phù hợp), nhưng nó phải là nhiều hay ít tương tự như:

GL GLSL 

4.1 - 4.1 
4.0 - 4.0 
3.3 - 3.3 
3.2 - 1.5 
3.1 - 1.4 
3.0 - 1.3 
2.x and lower - 1.2 and lower 

Vì vậy, câu chuyện dài ngắn - đồng phục được tạo sẵn của trình đổ bóng không được chấp nhận vì chức năng tương ứng trong OpenGL cũng không còn được dùng nữa; hoặc sử dụng phiên bản OpenGL cao hơn hoặc phiên bản GLSL thấp hơn.

+0

+1 Đó là một điểm tuyệt vời mà bạn đã nêu ra! – Stringer

+0

Vì vậy, với ngăn xếp ma trận khấu hao, tôi không chắc chắn phương pháp tiếp cận mới nên là gì. Trong mã cũ của chúng tôi, chúng tôi đã áp dụng các phép biến đổi cho các đối tượng được lập trình và hiển thị từng đối tượng từ một hàm chung. Vì vậy, có vẻ như bây giờ để có được điều đó để làm việc tôi cần phải cập nhật ma trận modelView theo cách thủ công sau mỗi lần biến đổi. Mô hình mới để làm điều này là gì? – Nigel

+1

Nếu bạn muốn một ngăn xếp ma trận trong GL3 +, hãy tạo một 'std :: vector ' và truyền đối tượng ma trận trên cùng với 'glUniformMatrix4fv'. Bạn có thể có một vài trong số đó, và bạn có thể quyết định cách sử dụng từng cái trong các trình đổ bóng của mình. – Kos

10

Để có được một trong hai ma trận bạn sử dụng hằng GL_MODELVIEW_MATRIX hoặc GL_PROJECTION_MATRIX với glGetxxxx:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
1
float modelview[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, modelview); 
Các vấn đề liên quan