2010-12-30 45 views
10

Tôi chỉ không hiểu OpenGL's glMatrixMode là gì.Tại sao có một glMatrixMode trong OpenGL?

Theo như tôi thấy, khi glMatrixMode(GL_MODELVIEW) được gọi, nó Tiếp theo là glVertex, glTranslate, glRotate và như thế, có nghĩa là, OpenGL lệnh mà nơi một số đối tượng ở đâu đó trong không gian. Mặt khác, nếu glOrtho hoặc glFrustum hoặc gluProjection được gọi (tức là cách đối tượng được đặt là được hiển thị), nó có cuộc gọi trước là glMatrixMode(GL_PROJECTION).

Tôi đoán những gì tôi đã viết cho đến nay là một giả định mà ai đó sẽ chứng minh tôi sai, nhưng không phải là điểm của việc sử dụng khác nhau Chế độ Matrix s chính xác vì có nhiều loại khác nhau của gl-chức năng : những người có liên quan với đặt đối tượng và đối tượng với cách đối tượng được hiển thị?

+6

Lưu ý rằng điều này hiện không được chấp nhận và bạn chỉ nên sử dụng trình đổ bóng và đồng phục rõ ràng, bắt đầu từ OpenGL 3.1. Ví dụ, OpenGL ES 2.0 không hỗ trợ glMatrixMode() và tương tự. (Vâng, tất nhiên trừ khi bạn có nhiều mã thực hiện điều này và/hoặc cần hỗ trợ phần cứng/trình điều khiển cũ.) – Macke

+4

Và 'glVertex' nên được coi là không được dùng nữa từ OpenGL 1.0. :) – Kos

+4

Khi bạn đề cập đến một cái gì đó như không được chấp nhận, xin vui lòng cũng đề cập đến những gì là sự thay thế hiện đại, bởi vì nếu không có nó không phải là nhiều thông tin. – SasQ

Trả lời

18

Đây là đơn giản và có thể được trả lời rất ngắn gọn:

  • đỉnh Rendering (như trong glVertex) phụ thuộc vào trạng thái hiện tại của ma trận gọi là "model-view ma trận""ma trận chiếu",

  • Các lệnh glTranslatef, glPushMatrix, glLoadIdentity, glLoadMatrix, glOrtho, gluPerspective và cả gia đình ảnh hưởng đến ma trận hiện tại (đó là một trong các phần trên),

  • Lệnh glMatrixModechọn ma trận (model-view hoặc chiếu) là bị ảnh hưởng bởi các lệnh đã đề cập ở trên.

(Ngoài ra, đó cũng là ma trận kết cấu sử dụng cho tọa độ texture, nhưng nó ít phải sử dụng.)

Vì vậy, các trường hợp sử dụng phổ biến là:

  • có ma trận model-view hoạt động hầu hết thời gian,
  • bất cứ khi nào bạn phải khởi tạo ma trận chiếu (thường ở đầu hoặc khi cửa sổ được thay đổi kích thước, có thể), chuyển hoạt động sang chiếu, thiết lập phối cảnh và quay lại chế độ xem mô hình.
+0

Bạn nên luôn đặt lại (tức là đặt lại mới) ma trận chiếu mỗi khi bạn đi qua một màn hình hiển thị đầy đủ. Bạn sẽ phải sử dụng nhiều dự đoán khác nhau cho bất kỳ ứng dụng thế giới thực nào. Ví dụ: để kết xuất một HUD trong trò chơi, bạn sẽ sử dụng một số phép chiếu khác, hơn là cho đúng cảnh. OpenGL không biết "khởi tạo" khác với việc lấy bối cảnh, vì vậy hãy quên đi việc làm một công cụ nào đó ở một nơi nào đó, hoặc làm mẫu thiết kế ngu xuẩn đó trong trình xử lý định hình lại. – datenwolf

+0

@datenwolf - Đúng, nhưng push/popMatrix trên ma trận chiếu cho lớp phủ 2D cũng hoạt động tốt, vì vậy nó không thực sự là một sự khác biệt lớn. – Kos

+0

Điều kỳ lạ là tôi không thể tưởng tượng cách 'glOrtho' hoặc' gluPerspective' có thể được sử dụng cho bất kỳ thứ gì khác ngoài ma trận chiếu, và 'glTranslate',' glRotate' và các biến đổi khác được sử dụng cho ma trận chiếu, vậy tại sao không các chức năng để thiết lập phép chiếu chọn ma trận chiếu trong nội bộ? Nó sẽ tiết kiệm cho người dùng một số nhức đầu và có nhiều bằng chứng chống ngốc, tôi đoán vậy. Các chức năng có thể được gọi trên một trong hai ma trận, vẫn có thể sử dụng lựa chọn chế độ như trước. – SasQ

2

Tất cả các tọa độ hình học trải qua một số phép biến đổi tuyến tính theo trình tự. Trong khi bất kỳ phép biến đổi tuyến tính nào cũng có thể được biểu diễn bằng một ma trận đơn, thường thì bạn muốn nghĩ về một chuỗi các phép biến đổi và chỉnh sửa trình tự, và nếu bạn chỉ có một ma trận duy nhất, bạn chỉ có thể thay đổi các đầu của chuỗi đó. Bằng cách cung cấp một số bước chuyển đổi, OpenGL cung cấp cho bạn một số vị trí ở giữa, nơi bạn cũng có thể thay đổi quá trình chuyển đổi.

Gọi glMatrixMode trước khi phát ra hình học không có tác dụng gì cả. Bạn gọi glMatrixMode trước khi chỉnh sửa ma trận biến đổi, để xác định vị trí trong chuỗi tổng thể những chỉnh sửa đó xuất hiện.

(NB: Nhìn vào chuỗi có ý nghĩa hơn rất nhiều nếu bạn nhớ rằng bản dịch và luân chuyển không giao hoán, bởi vì dịch làm thay đổi tâm quay Tương tự dịch và mở rộng quy mô không giao hoán..)

4

Bạn có thể sử dụng glRotate và glTranslate cho ma trận chiếu.

Ngoài ra: OpenGL hỗ trợ chuyển đổi kết cấu và màu sắc. Nếu bạn hoạt động tính năng này, bạn có thể ví dụ sửa đổi các tọa độ kết cấu của một đối tượng mà không cần viết lại kết cấu tọa độ từng khung hình (chậm).

Đây là một tính năng rất hữu ích nếu bạn muốn cuộn kết cấu trên một đối tượng. Tất cả những gì bạn phải làm là vẽ đối tượng được kết cấu, thiết lập chế độ ma trận thành GL_TEXTURE và gọi glTranslate để thiết lập độ lệch thành kết cấu.

+2

Ngoài ra, ma trận kết cấu projective được sử dụng với bóng và kết cấu chiếu (đèn sân khấu, đèn pha, sàn nhảy, máy chiếu phim, v.v ...) – Macke

3

Như Nils đã chỉ ra, bạn có nhiều ma trận hơn là những gì bạn đã đề cập.

Tôi sẽ thêm một vài suy nghĩ:

  • OpenGL lõi (từ 3.1 trở đi) không đi với tất cả những thứ ma trận hoàn toàn, thì GL ES 2.0. Điều này chỉ đơn giản là do thực tế là các chương trình đổ bóng loại bỏ nhiều yêu cầu của việc chúng tiếp xúc ở cấp GL (nó vẫn là một sự tiện lợi, mặc dù). Sau đó bạn chỉ có đồng phục, và bạn phải tính toán giá trị của họ hoàn toàn ở phía khách hàng.

  • Có nhiều điểm nhập thao tác ma trận hơn các điểm nhập bạn đề cập.Một số trong số chúng áp dụng tốt như nhau để chiếu/modelview (glLoadIdentity/glLoadMatrix/glMultMatrix, Push/Pop), Chúng rất hữu ích nếu bạn muốn thực hiện tính toán ma trận (nói bởi vì bạn cần chúng ở đâu đó trong ứng dụng của bạn).

+2

"Không sử dụng tất cả nội dung ma trận" này không thực sự chính xác. Phép nhân ma trận vẫn là cách áp dụng các phép biến đổi cho các tọa độ đỉnh. Sự khác biệt là nó không còn là một hàm cố định trong đường ống, nhưng được điều khiển hoàn toàn bằng các trình đổ bóng có thể lập trình được. –

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