Giới thiệu
Nhiều công cụ kết xuất đồ họa vector chính tuyến có một lỗ hổng thuật toán trong đó. Chúng kết xuất từng hình dạng một cách riêng biệt và antialias bằng cách tính toán vùng phủ sóng pixel và sau đó kết hợp chúng với nhau. Vâng, nó đơn giản nhưng các giải pháp chính xác thậm chí còn đơn giản hơn.
Điều này dẫn đến một vấn đề về sự kết hợp vì nó liên kết vùng phủ sóng bởi tính minh bạch. Pha trộn Alpha tuân theo quy tắc không thể hiện chính xác tình huống, ví dụ: lấy một pixel có độ phủ 50% nằm cạnh một pixel cũng được phủ bổ sung 50% không kết thúc với độ bao phủ 100%, kết thúc với độ phủ 75% . Điều này trông như thế nào phụ thuộc vào cách thuật toán được điều chỉnh và các chi tiết khác nhưng thực chất đây là một lỗi đã biết. Ai đó thậm chí đã gặp khó khăn trong việc ghi lại các lỗi động cơ khác nhau cùng với việc viết một bài báo cho thấy làm thế nào nó có thể được thực hiện tốt hơn.
Hình 1 : Mẫu hoàn toàn không đại diện, hiển thị hình dạng được tạo từ các hình tam giác hiển thị lỗi phóng to ở hàng trên cùng. Nguồn SVG
Vấn đề có một giải pháp ngây thơ đơn giản * chỉ siêu mẫu mà không tính toán độ bao phủ và lọc hình ảnh xuống. Là một phần thưởng bạn có thể sử dụng các thuật toán tái tạo hình ảnh tốt hơn so với lọc hộp (đọc A Pixel không phải là hình vuông 3 ). Thậm chí có những giải pháp có tốc độ tương đương như các giải pháp hiện tại và những giải pháp này dễ thực hiện hơn trong các đường ống rasterization phần cứng (và bạn hiếm khi thấy lỗi này trên GPU vì nó được xây dựng để tránh vấn đề này).
Đây cũng không phải là một vấn đề mà không có chi phí. Có nhiều người làm việc trong thiết kế đồ họa dành nhiều thời gian không cần thiết để cố gắng khắc phục vấn đề này bằng cách đảm bảo có sự chồng chéo ở đây và không có sự chồng chéo nào ở đó để khắc phục sự cố mà máy tính nên làm cho họ. Và thất bại ngoạn mục trong nhiều trường hợp. Nhưng khách hàng của họ không quan tâm tại sao có lỗi ở đó họ phải sửa nó.
Câu hỏi
Làm thế nào để lỗi lan truyền? Vì tất cả chúng đều mắc cùng một lỗi nên người ta có thể kết luận rằng chúng sử dụng cùng một nguồn cho thuật toán của chúng. Điều gì có thể đã khiến các nhà thiết kế chọn thuật toán này? Tại sao chỉ các lập trình viên 3D nhận ra lỗi này và thậm chí mã hóa phần của nó trong API và giảng dạy trong khi các lập trình viên 2D thì không?
Làm thế nào để đảm bảo rằng lỗi này dừng lan truyền hơn nữa?
Phụ lục (nhưng tôi không hỏi về điều này)
* Rõ ràng tuyên bố của tôi rằng siêu lấy mẫu hoạt động không tì vết là phi thường và đòi hỏi bằng chứng phi thường. Ok, do đó, chìa khóa để siêu lấy mẫu làm việc là siêu mẫu không thực hiện xử lý bảo hiểm. Về bản chất, siêu mẫu lấy mỗi mẫu như một mẫu điểm. Vì mẫu điểm không đưa ra giả định về vùng bên dưới, nên nó không gây ra so sánh alpha ở nơi nó không xảy ra.
Để nó hoạt động ổn định, như được mô tả trong một trong những câu trả lời. Chúng ta cần thực hiện để xử lý các mẫu với lấy mẫu nguyên cho thống nhất. Điều này đảm bảo với chúng tôi rằng mỗi điểm một khi được chuyển đổi sang không gian màn hình sẽ có cùng một giải pháp cho các tọa độ bằng nhau và không có mẫu nào được tô bởi viền pixel 2 lần. Để làm điều này, một mẫu có thể không kích hoạt pixel ot chính xác nếu đó là mẫu dưới cùng bên trái (vì vậy chúng tôi đưa ra quy tắc rằng các cạnh chính xác được xử lý trong> vs <=). Tất cả trừ một card đồ họa console hoạt động như thế này. Nó đảm bảo rằng không cần thêm dữ liệu vào bộ nhớ cache và không cần thực hiện thêm thử nghiệm gần đó. Giải pháp này ổn định, tổng quát và nhất quán hơn các giải pháp dựa trên phạm vi bảo hiểm.
Thuật toán hoàn toàn giống với bản gốc với ít mã hơn và nhiều mẫu hơn một chút. Do đó, nó là nhất quán nếu không nhiều hơn thuật toán dựa trên phạm vi bảo hiểm. Chúng tôi biết điều này bởi vì chúng tôi đã sử dụng các phương pháp như vậy trong nhiều năm ở gần như bất kỳ lĩnh vực xử lý tín hiệu nào khác cũng như các card đồ họa.
Vì vậy, phương pháp này có một nhược điểm? Vâng, nó chậm hơn một chút nếu bạn chỉ đưa ra một giả định ngây thơ. Về mặt lý thuyết, nó có hành vi tiệm cận nhanh hơn so với trình rasterizer, giống như một raytracer, nó vẫn chỉ ngang bằng trong các cảnh điển hình. Ngoài ra, nó có thể làm cho việc sử dụng các hiệu ứng dựa trên tích chập trở nên đau đớn hơn để thực hiện.