Ngăn xếp ma trận của OpenGL so với nhân tay


8

Hiệu quả hơn khi sử dụng ngăn xếp chuyển đổi của OpenGL hoặc áp dụng các biến đổi bằng tay.

Tôi thường nghe nói rằng bạn nên giảm thiểu số lần chuyển trạng thái trong đường ống đồ họa của mình. Đẩy và bật ma trận dịch có vẻ như là một thay đổi lớn. Tuy nhiên, tôi tự hỏi liệu card đồ họa có thể có khả năng nhiều hơn bù cho trục trặc đường ống hay không bằng cách sử dụng phần cứng thực thi song song của nó để nhân số lượng lớn các đỉnh.

Trường hợp cụ thể của tôi. Tôi có phông chữ được kết xuất thành một tấm sprite. Các tọa độ của mỗi ký tự hoặc một chuỗi được tính toán và thêm vào bộ đệm đỉnh. Bây giờ tôi cần di chuyển chuỗi đó. Sẽ tốt hơn nếu lặp qua bộ đệm đỉnh và điều chỉnh từng đỉnh bằng tay hoặc tạm thời đẩy một ma trận dịch mới?


Phụ thuộc vào phiên bản GL mà bạn đang nhắm mục tiêu. Chúng không được dùng trong 3.x trở đi.
Vịt Cộng sản

Câu trả lời:


7

Theo hiểu biết của tôi rằng trong các phiên bản gần đây nhất của thông số kỹ thuật (3.3 và 4.x), các ngăn xếp ma trận đã biến mất và bạn cần theo dõi ma trận biến đổi của mình bằng tay. Tôi tin rằng điều này cũng có thể đúng với thông số kỹ thuật di động (ES).

Nếu bạn đang tìm kiếm một cách nhất quán để xử lý ma trận của mình bằng tay, bạn có thể quan tâm đến GLM . Đó là một thư viện toán học khá gọn gàng (bao gồm các phép biến đổi ma trận) được mô phỏng theo thông số GLSL, do đó bạn chỉ cần giữ một tập các thói quen toán học trong đầu khi xử lý mã OpenGL.


bất cứ ai có thể xác nhận điều này? Tôi đã học lập trình đồ họa với OpenGL 1.5 và nghĩ rằng tôi đã tiến bộ vì tôi đang thử nghiệm một số tính năng 2.0. Bạn có thể nói tôi hơi lạc lõng. Bỏ hỗ trợ cho các ma trận dịch thuật dường như là một bất lợi rất lớn.
deft_code

1
Chỉ cần kiểm tra lại. Có, các ngăn xếp ma trận không được dùng trong 3.0 - 3.2 và bị xóa trong 3.3 và 4.x. Ý tưởng là vì toàn bộ đường ống đã được lập trình, bạn sẽ chuyển ma trận cuối cùng của mình vào shader và đi từ đó. Dù vậy, không có gì ngăn bạn gắn bó với OpenGL 2.0. Tất cả các chức năng ngăn xếp ma trận bạn đã sử dụng vẫn sẽ ở đó.
Bob Somalia

Lưu ý rằng điều đó không có nghĩa là "hỗ trợ cho ma trận dịch" đã bị hủy, @deft_code. Rốt cuộc, một ma trận dịch chỉ là một tập hợp các giá trị dấu phẩy động cụ thể, bạn có thể tự mình xây dựng một giá trị. Nó thực sự nằm trong lĩnh vực "đại số tuyến tính" hơn là truy cập vào đường ống đồ họa, thực sự - lưu ý rằng D3D cũng không có chức năng tương tự (chúng nằm trong một thư viện tiện ích riêng biệt, D3DX).

1
Bổ sung nhẹ: GLES 1.x là tương tự chức năng cố định của OpenGL 1.5 (ish) và bao gồm các ngăn xếp kết cấu, mô hình và trình chiếu. GLES 2.x là OpenGL được lập trình đầy đủ và hoàn toàn không bao gồm các hoạt động ma trận hoặc bất kỳ phần còn lại nào của đường ống chức năng cố định. Vì vậy, trong GLSL cũng không có gl_Vertex / Bình thường / Màu sắc / v.v. Làm thế nào bạn truyền thông tin vào một chương trình shader hoàn toàn phụ thuộc vào bạn.
Tommy

3

Ngăn xếp là tùy chọn ít tối ưu hơn ở đây - không phải vì việc đẩy và bật nó rất tốn kém, vì nó không bao giờ gây ra thay đổi trạng thái cấp trình điều khiển phức tạp (ma trận không nên được gửi đến thẻ cho đến khi lệnh kết xuất được ban hành , do đó, tất cả đều là thao tác phía CPU trong API, thường).

Vấn đề với ngăn xếp là nó có giới hạn về mức độ bạn có thể đẩy nó - đó là một trong những thông số bạn có thể nhận được thông qua glGet * Tôi nghĩ. Không có lợi thế lớn để sử dụng ngăn xếp trừ khi bạn không có hoặc không có khả năng / không muốn viết toán học ma trận. Tôi khuyên bạn nên tự làm điều đó.

Tôi không biết trạng thái của các chức năng ngăn xếp trong GL hiện đại. Tôi tin rằng họ cũng đã bị từ chối / loại bỏ, nhưng tôi không có nhu cầu thực sự sử dụng GL trong một thời gian vì vậy tôi đã không cập nhật.


3

Như những người khác đã lưu ý, ngăn xếp ma trận đang trên đường ra, đó là một lý do tốt để điều tra các lựa chọn thay thế.

Trong một trong các dự án của tôi, tôi đã sử dụng các ma trận của OpenGL để tính toán ma trận của mình, nhưng cuối cùng phải sử dụng các hàm glGet để lấy lại ma trận để tôi có thể thực hiện một số thao tác trên ma trận mà các hàm riêng của OpenGL không hỗ trợ. Hiệu suất rất tệ và tôi đã tìm ra sự mất mát đối với chức năng glGet duy nhất. Có thể các ma trận op thực sự được thực hiện trên GPU bằng cách nào đó và việc sử dụng glGet đã gây ra hiện tượng lóa đường ống hoặc một cái gì đó.

Dù lý do là gì, tôi đã thay thế các phép toán ma trận bằng CML , thư viện toán học có thể định cấu hình và hiệu suất được cải thiện đáng kể. Tôi không chỉ không còn bị ràng buộc với các số liệu hiệu suất của các hoạt động ma trận OpenGL, CML còn bao gồm hàng tấn hoạt động mà OpenGL không hỗ trợ.

Và thực hiện một chồng ma trận là khá dễ dàng bằng cách sử dụng vectơ STL hoặc một số như vậy.


2

Tôi không chắc về mức độ kinh nghiệm của bạn, nhưng tôi khuyên bạn nên làm bằng tay. Có thể mất nhiều nỗ lực hơn để tìm hiểu làm thế nào để làm điều này, nhưng sẽ vô cùng có lợi khi biết ma trận của bạn đang làm gì và có thể tự điều khiển chúng. Nó cũng sẽ giúp bạn nhận thức rõ hơn về các vấn đề có thể tăng lên khi áp dụng ma trận theo các thứ tự khác nhau (ví dụ: chia tỷ lệ sau đó xoay). Tôi biết rằng tôi đã dành nhiều giờ cố gắng để tìm ra "lỗi" kết xuất kỳ lạ trước khi quyết định thời gian của mình sẽ tốt hơn dành cho việc nghiên cứu kỹ lưỡng từng hoạt động đang làm. Đó là giá trị đầu tư.

Giải quyết vấn đề cụ thể của bạn, áp dụng một biến đổi cho các đỉnh có vẻ như là cách dễ nhất, chỉ cần lưu ý về thứ tự các hoạt động của ma trận.


1

Vấn đề chính mà tôi thấy là bạn cần truy cập các kết quả cho các nhiệm vụ trò chơi khác và việc nhận các kết quả đó có thể phức tạp và chậm.

Đó là lý do tại sao tôi thích tự mình thực hiện các hoạt động ma trận đó.

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.