Vẫn còn lợi thế khi sử dụng gl_quads?


10

OK, tôi hiểu rằng gl_quads không được dùng nữa, và do đó chúng tôi không 'nên' sử dụng chúng nữa. Tôi cũng hiểu rằng một PC hiện đại khi chạy trò chơi bằng gl_quads thực sự là vẽ hai hình tam giác.

Bây giờ, tôi đã nghe nói rằng một trò chơi nên được viết bằng cách sử dụng hình tam giác thay thế. Nhưng tôi tự hỏi liệu, do các chi tiết cụ thể về cách OpenGL biến bộ tứ đó thành hai hình tam giác, việc sử dụng bộ tứ vẫn có thuận lợi không?

Cụ thể, tôi hiện đang kết xuất nhiều quads không được kết nối từ các đối tượng bộ đệm khá lớn. Một trong những lĩnh vực tôi phải cẩn thận là vectơ phao mà tôi đang sử dụng để tạo / cập nhật các đối tượng bộ đệm này nhận được bao nhiêu (tôi có khá nhiều giá trị float bổ sung cho mỗi đỉnh và rất nhiều đỉnh trong bộ đệm - bộ đệm lớn nhất khoảng 500KB).

Vì vậy, điều gây ấn tượng với tôi là nếu tôi thay đổi các đối tượng bộ đệm của mình để vẽ các hình tam giác thì dữ liệu đỉnh này sẽ lớn hơn 50% (sáu đỉnh để vẽ một hình vuông thay vì 4) và mất 50% để CPU tạo ra.

Nếu gl_quads vẫn hoạt động, tôi có nhận được lợi ích ở đây không, hay bộ nhớ thêm 50% và thời gian CPU vẫn được sử dụng trên chuyển đổi tự động của OpenGL thành hai hình tam giác?


5
Tôi chắc chắn OpenGL hỗ trợ một số loại bộ đệm đỉnh được lập chỉ mục, nghĩa là bạn chỉ lưu trữ 4 đỉnh giống nhau cho một hình tứ giác và thay vì lặp lại toàn bộ các đỉnh để tạo hai hình tam giác, bạn chỉ lặp lại các chỉ số: [0,1,2] , [2,3,0]

Câu trả lời tuyệt vời ở đây
bobobobo

Tôi tin rằng thông số GL vẫn quy định một số trường hợp trong đó vẽ là một vấn đề quad, ví dụ như với glPolygonMode (..., GL_LINE).
Maximus Minimus

Câu trả lời:


5

Kiểm tra trò chơi thực tế của bạn. Nếu quads nhanh hơn, sử dụng chúng. Nếu không, đừng.

Người ta có thể cho rằng chúng chậm hơn trong một số trường hợp vì một số phần cứng không hỗ trợ quads, vì vậy trình điều khiển phải thực hiện rất nhiều công việc để "sửa" các cuộc gọi rút thăm quad. Một số phần cứng không hỗ trợ quads, thực hiện phân chia thành các hình tam giác trong một số bước lắp ráp đầu vào chức năng cố định, do đó nó hoạt động mà không có chi phí đáng kể. Ngoài ra còn có các câu hỏi liên quan đến cách các quads được gửi lập chỉ mục so với không lập chỉ mục, khi bạn nêu ra, và điều này giúp sử dụng tốt hơn băng thông truyền tải xe buýt hạn chế và thời gian tạo CPU. Trí tuệ dân gian nói rằng nên tránh các quads, đó là lời khuyên tốt nếu bạn bắt đầu từ không có gì, có thể không quá nhiều nếu mã của bạn đã hoạt động. trí tuệ dân gian nói rằng rất nhiều thứ thực hiện giết người mặc dù các trò chơi thực sự, hoạt động tốt làm những điều đó.

Tóm lại, kiểm tra. Đừng giả sử và đừng hỏi Internet để được tư vấn về hiệu suất. Đôi khi chúng tôi có thể đúng nhưng thường xuyên hơn, chúng tôi sẽ cung cấp cho bạn dữ liệu hết hạn, dữ liệu dựa trên một số trường hợp cụ thể mà bạn không gặp phải hoặc rác hoàn toàn mà chúng tôi tự mua từ Internet hoặc đồng nghiệp (chính họ có thể không có kinh nghiệm trực tiếp).


3

Các lựa chọn thay thế là gì? Vâng, một cách khác là sử dụng Geometry Shader , vượt qua một GL_LINES_ADJACENCYnguyên thủy (4 đỉnh) và để GS chuyển đổi nguyên thủy này thành một dải tam giác. Tuy nhiên, điều đó sẽ chậm hơn để kết xuất, bởi vì người ta nên cho rằng các shader hình học luôn luôn chậm hơn để kết xuất.

Một phương pháp tốt hơn là sử dụng kết xuất được lập chỉ mục. Ở đây, bạn có hai lựa chọn thay thế: GL_TRIANGLESGL_TRIANGLE_STRIPvới khởi động lại nguyên thủy. Cái sau sẽ dẫn đến bộ đệm chỉ mục ngắn hơn một chút (một chỉ mục cho mỗi quad). Bạn có thể sử dụng lại bộ đệm chỉ mục tương tự cho bất kỳ kết xuất quad nào, vì vậy bạn sẽ không cần cập nhật hoặc sửa đổi bộ đệm chỉ mục.

Tôi cũng sẽ đề nghị sử dụng quần short không dấu làm loại chỉ mục. Nếu bạn cần kết xuất nhiều hơn 16384 quads cùng một lúc, sau đó thực hiện nhiều cuộc gọi kết xuất, sử dụng glDrawElementsBaseVertex để bù các chỉ số.


Một số điểm chuẩn gần đây tôi đã thực hiện cho thấy glMultiDrawArrays bây giờ là một con đường nhanh chóng trên cả NV và AMD (không bận tâm với Intel) vì vậy có một lựa chọn khác - glMultiDrawArrays với quạt hoặc dải.
Maximus Minimus

@ mh01: Điều này đòi hỏi một mảng các lệnh vẽ phía máy khách. Bạn cần glMultiDrawArraysIndirectphải làm điều đó phía GPU. Mà bạn có thể làm, nhưng nó giới hạn phần cứng.
Nicol Bolas
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.