Bảo hiểm - lỗ hổng trong thuật toán - làm thế nào để thoát khỏi việc sử dụng nó?


10

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.

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

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.


Sẽ thêm hình ảnh cho bản ghi nhớ của tôi sau khi ngày làm việc của tôi kết thúc. Sau tất cả, đây là xử lý đồ họa, nó có một diễn giải trực quan
joojaa

Câu trả lời:


6

Siêu mẫu, khi được thực hiện một cách ngây thơ, đắt tiền về mặt tính toán, vì nếu bạn sử dụng ví dụ một nửa kích thước pixel của màn hình, bạn cần gấp bốn lần bộ nhớ và độ rộng băng tần. Wikipedia đề cập đến điều này và cũng đặt tên cho siêu mẫu thích ứng là một giải pháp khả thi. Nhưng điều đó bắt đầu làm cho thuật toán phức tạp hơn, phức tạp hơn và khó thực hiện hơn.

Và tôi đoán đó là lý do bạn đang tìm kiếm: nếu bạn muốn một thuật toán không cần nhiều bộ nhớ và thời gian chạy, mọi thứ trở nên phức tạp hơn nhiều so với cách tiếp cận "minh bạch" ngây thơ.


Bạn thực sự không cần lưu trữ các mẫu tất cả những gì bạn cần làm là lưu trữ thiết lập rasterisation. Phương thức dựa trên phạm vi bảo hiểm cũng không lưu trữ chúng vì vậy đây không phải là một bước lùi. Phương pháp ngây thơ chỉ được trình bày vì dễ hiểu, bạn có thể dễ dàng thực hiện lấy mẫu dựa trên ưu tiên. Ngoài ra, nếu bạn muốn chuyển các giải pháp dựa trên phạm vi bảo hiểm của mình sang GPU, bạn sẽ cần thực hiện nhiều công việc phụ và bạn sẽ không tương thích với mô hình của nó.
joojaa

@joojaa: bạn có thể phác thảo ý của bạn bằng cách "lưu trữ thiết lập rasterisation" hoặc đưa ra một liên kết trong đó cách tiếp cận được giải thích theo cách người ta không phải tự đào qua một bài báo khoa học> 20 trang?
Doc Brown

Mỗi pixel độc lập với nhau, vì vậy bạn chỉ cần lưu các mẫu trong khi thực hiện pixel, bạn có thể loại bỏ chúng một cách an toàn sau khi này. Nếu bạn muốn sử dụng một fiter thứ tự cao hơn thì bạn chỉ có thể lưu trữ một chế độ xem hạn chế. Vì vậy, tất cả những gì bạn thực sự cần làm là phân bổ bộ nhớ cho lõi xử lý của mình để có thể (16-256 byte cho mỗi luồng)
joojaa

oh xin lỗi, bạn thậm chí không cần lưu trữ các mẫu nếu bạn không lọc hộp, bạn chỉ có thể sử dụng công thức để di chuyển / chạy trung bình mà không cần bạn lưu trữ các mẫu riêng lẻ
joojaa

@joojaa: Tôi không hiểu - bạn không cần tính toán các mẫu trước hết trong số các hình dạng có liên quan , có thể hàng trăm hoặc hàng nghìn và sau đó lọc xuống màn hình raster của bạn?
Doc Brown

6

Supersampling sẽ không giải quyết được vấn đề nói chung: nó sẽ chỉ làm cho nó ít được chú ý hơn. Với các pixel có kích thước bằng một nửa, vấn đề sẽ giảm một nửa đáng chú ý nhưng nó sẽ không biến mất.

Điểm kiến ​​trúc đằng sau các thiết kế này là chúng tôi muốn lệnh "render tam giác ABC" có ý nghĩa nhất định. Chúng tôi không muốn nó mơ hồ trừ khi được coi là một phần của tập hợp các lệnh vẽ - ví dụ: có một ý nghĩa khi "kết xuất tam giác BCD" cũng nằm trong bộ sưu tập (có cùng màu hoặc khác màu) và ý nghĩa khác khi không phải vậy

Ví dụ, xem xét một ngàn hình tam giác, thậm chí tìm thấy tất cả các hình tam giác có chung một bên hoặc một phần của ABC đều nặng về mặt tính toán (hãy nhớ rằng nó phải được thực hiện lại một nghìn lần). Có rất nhiều vấn đề thực tế khác: đáng chú ý là tất cả các yêu cầu kết xuất ban đầu phải được giữ xung quanh, ngay cả khi chúng được rút ra từ lâu, trong trường hợp chúng cần được đánh giá lại vì yêu cầu mới, bổ sung.

Điểm mấu chốt là một giải pháp hoàn toàn phù hợp là không thể thực hiện được. Vẫn còn câu hỏi: chúng ta có nên cố gắng cải thiện tình hình hiện tại khi có thể không? Nói chung, câu trả lời cho câu hỏi đó là Không. Việc triển khai mô hình hoàn toàn nhất quán luôn tốt hơn, ngay cả khi chính mô hình đó có những hạn chế mà bạn đã minh họa. Sự thay thế sẽ là một triển khai đôi khi làm tốt hơn và đôi khi không, không có cách nào để lập trình viên biết cái nào trong hai cái này sẽ được giữ trong bất kỳ trường hợp cụ thể nào. Hơn nữa, nó có thể chuyển từ "làm tốt hơn" sang "không làm tốt hơn" do kết quả của những thay đổi nhỏ do lập trình viên thực hiện - hoặc thậm chí là kết quả của những điều nằm ngoài sự kiểm soát của lập trình viên. Dự đoán, trong một bối cảnh lập trình, là xa,


Đây là một vấn đề của tính toán bảo hiểm nếu siêu mẫu của tôi KHÔNG thực hiện tính toán bảo hiểm thì nó không có vấn đề gì vì nó sẽ hội tụ đến câu trả lời rea không chỉ làm giảm vấn đề. Bạn cần một số mã để chứng minh điều này? Đây là cách card đồ họa của bạn hoạt động và nó không gặp phải vấn đề này. Nếu không, mọi trò chơi bạn thấy sẽ thể hiện vấn đề. Tôi không mua câu trả lời này vì nó dựa trên logic sai.
joojaa

Các trò chơi @joojaa hoặc không thực hiện bất kỳ khử răng cưa nào hoặc sử dụng siêu mẫu để khử răng cưa, điều này mang lại bốn cấp độ khử răng cưa thông thường. Điều này không đủ tốt cho đồ họa chất lượng trình bày nơi bạn muốn có khoảng 64 cấp độ về khử răng cưa. Vì vậy, các trò chơi trao đổi một vấn đề cho một vấn đề khác.
Pete Kirkham

@PeteKirkham tùy thuộc vào cài đặt của bạn, một số gam cho phép bạn chỉ định số lượng mẫu. Dù sao, bạn không cần nhiều hơn 16 mẫu để tạo mức trình bày AA nếu bạn sử dụng bộ lọc thứ tự cao hơn lọc hộp. Lưu ý rằng hình ảnh không có lỗi trong ví dụ của tôi được thực hiện bằng cách siêu mẫu bên trong bộ tái cấu trúc phần cứng.
joojaa
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.