Hiệu suất của đồ họa vector so với bitmap hoặc đồ họa raster


20

Đôi khi tôi sử dụng đồ họa vector, đơn giản vì chúng trông chỉ đẹp hơn một chút trong một số trường hợp và những lần khác, tôi sử dụng đồ họa bitmap / raster.

Tôi đã tự hỏi, có sự khác biệt đáng kể về hiệu suất giữa hai tùy chọn này không?


6
Thực sự, nó phụ thuộc vào nhiều yếu tố. NVIDIA cung cấp khả năng tăng tốc phần cứng cho đồ họa vector. Bạn đã thấy nó? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Câu trả lời:


15

Như TheBuzzSaw đã nói, nó phụ thuộc vào rất nhiều thứ, bao gồm cả việc triển khai đồ họa rasterized so với đồ họa vector.

Dưới đây là một số phương pháp đồ họa vector hiệu suất cao được kết xuất bằng các phương pháp rasterization truyền thống.

Loop và Blinn chỉ ra cách hiển thị đường cong bậc hai của đồ họa vector bằng cách hiển thị một tam giác đơn và sử dụng tọa độ kết cấu trong trình đổ bóng pixel để cho biết một pixel nằm trên hay dưới đường cong: http: //www.msr-waypoint. net / en-us / um / people / cloop / LoopBlinn05.pdf

Ý tưởng cơ bản là bạn đặt các vị trí góc tam giác của mình thành 3 vị trí điểm kiểm soát và bạn đặt tọa độ kết cấu ở mỗi góc lần lượt là (0,0), (0,5,0) và (1,1). Trong trình đổ bóng của bạn, nếu tọa độ kết cấu nội suy (x * xy) <0, thì pixel nằm bên dưới đường cong, nếu không thì nằm trên đường cong.

Bạn có thể thấy một triển khai giả của nó trên shadertoy tại đây: https://www.shadertoy.com/view/4tj3Dy

Đối với phương pháp thứ hai, đây là một phương pháp từ Valve, trong đó khoảng cách đến hình dạng được lưu trữ trong một kết cấu, thay vì dữ liệu pixel, cho phép vẽ đồ họa vector bằng cách sử dụng lấy mẫu kết cấu. Việc giải mã rất đơn giản, nó có thể được thực hiện ngay cả trên phần cứng chức năng cố định chỉ bằng một thử nghiệm alpha! http://www.valvesoftware.com/publications 2007 / SIGGRAPH2007_AlphaTestedMagnification.pdf

Để cho bạn biết kỹ thuật thứ hai hoạt động tốt như thế nào, hình ảnh ria mép 1024x768 này được tạo ra từ một hình ảnh nguồn 64x32 có một kênh màu duy nhất! (còn gọi là 2KB không nén)

nhập mô tả hình ảnh ở đây

Tôi cũng đã viết một số thứ về nó trên blog của mình: http://blog.demofox.org/2014/06/30/distance-field-textures/

Dưới đây là một số mã OpenCL mẫu để chỉ ra cách đơn giản:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

Cả hai kỹ thuật này đều siêu nhanh, và làm mờ ranh giới giữa vector và đồ họa rasterized một chút. Chúng được kết xuất bằng các kỹ thuật rasterization, nhưng có các thuộc tính phóng to / thu nhỏ như các kỹ thuật đồ họa vector.



Vâng, đó là một kỹ thuật rất hay, đó là kỹ thuật thứ hai tôi đã đề cập và tôi cũng liên kết với cùng một pdf ở trên.
Alan Wolfe

Rất tiếc, đã bỏ lỡ nó, xin lỗi.
Teh internets được làm bằng catz

1
Một giải pháp thích ứng cho việc khử răng cưa cạnh của các trường khoảng cách có thể được tìm thấy ở đây: Essentialmath.com/blog/?p=151 .
Jim Van Verth

8

Có thể có.

Câu trả lời ít kỹ thuật hơn:

Nếu bạn đang xây dựng một trang web hoặc một ứng dụng khác mà bạn không liên quan gì đến lập trình đồ họa thì câu trả lời có lẽ là có. Các API cơ bản sẽ cố gắng đoán cách kết xuất chúng và lưu trữ chúng một cách hiệu quả. Tuy nhiên, khi ứng dụng của bạn chạy và API đôi khi đoán không chính xác, nó có thể phải kết xuất lại mọi thứ và ảnh hưởng đến hiệu suất.

Thêm kỹ thuật:

Hãy nhớ rằng trừ khi bạn đang sử dụng một trong những GPU mới nhất và thư viện để vẽ đường dẫn vectơ trên GPU thì tất cả các kết cấu bitmap đều được GPU hiển thị.

Tôi sẽ xem xét trường hợp điển hình trong đó đồ họa vector được kết xuất thành kết cấu. Ở đây hiệu suất sẽ phụ thuộc vào chuỗi công cụ của bạn, liệu ứng dụng của bạn có tự động tạo họa tiết từ tài sản vector hay không và liệu đồ họa có được xem ở các mức thu phóng khác nhau hay không. Có hai vấn đề liên quan: tài nguyên và kết cấu. Nếu bạn chỉ hiển thị đồ họa ở kích thước tĩnh thì tôi sẽ nói không có sự khác biệt và có lẽ chuỗi công cụ của bạn có thể chuyển đổi các tài sản thành đồ họa bitmap trước khi chạy. Tuy nhiên, nếu chúng đang được hiển thị ở các kích cỡ khác nhau hoặc trong thế giới 3D thì bạn sẽ cần mip kết cấu được ánh xạ cần nhiều bộ nhớ hơn. Họ sẽ mất rất nhiều bộ nhớ nếu bạn thực sự muốn thấy độ trung thực của họ 'gần gũi' với kết cấu lớn hơn.

Tôi hi vọng cái này giúp được.


6

Có một vài cách kết xuất đồ họa vector. Như TheBuzzSaw đề cập, NVIDIA có một tiện ích mở rộng có thể hiển thị các đường dẫn chung khá nhanh (nhưng tất nhiên nó chỉ hoạt động trên GPU NVIDIA). Và Alan Wolfe đề cập đến các phương thức bề mặt ẩn (các trường Loop-Blinn / khoảng cách), xác định một hàm cho biết bạn đang ở trong hay bên ngoài một hình dạng, và tô màu các pixel dựa trên hàm đó. Một phương pháp khác là stprint-and-cover, trong đó bạn kết xuất đường dẫn vào bộ đệm stpson và sử dụng số chẵn lẻ để xác định xem đường dẫn có bao gồm một pixel hay không.

Tuy nhiên, nói chung, sự đánh đổi là raster render sẽ nhanh hơn, nhưng dễ bị răng cưa hơn (ngay cả các trường khoảng cách bị phá vỡ ở quy mô thấp và cao). Kết xuất đường dẫn yêu cầu rất nhiều thiết lập nhưng về lý thuyết có thể được thu nhỏ theo bất kỳ độ phân giải nào.

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.