소개
대부분의 주요 벡터 그래픽 렌더링 엔진에는 알고리즘 결함이 있습니다. 픽셀 적용 범위를 계산하여 각 셰이프를 개별적으로 렌더링하고 앤티 앨리어싱을 만든 다음 서로의 상단에 구성합니다. 예, 간단하지만 올바른 솔루션은 더 간단합니다.
이것은 투명성에 의해 커버리지를 둥글게 만들면서 conflation 문제를 야기합니다. 알파 블렌딩은 상황을 정확하게 나타내지 않는 규칙을 따릅니다. 예를 들어 50 % 덮힌 픽셀은 50 % 보완되는 픽셀과 인접하며 100 % 커버리지로 끝나지 않으며 75 % 커버리지로 끝납니다. . 이것이 어떻게 보이는지는 알고리즘이 조정되는 방법과 다른 세부 사항에 달려 있지만 본질적으로 이것은 알려진 오류입니다. 누군가는 다른 엔진 오류 를 문서화하는 데 어려움을 겪고 어떻게 더 잘 수행 할 수 있는지 보여주는 종이를 작성했습니다.
이미지 1 : 대표적이지 않은 샘플로 상단 행에 확대 오류를 나타내는 삼각형으로 만든 모양을 렌더링합니다. SVG 소스
이 문제는 커버리지 계산없이 수퍼 샘플로 간단한 순진한 솔루션 *을 가지고 이미지를 필터링합니다. 보너스로 상자 필터링보다 더 나은 이미지 재구성 알고리즘을 사용할 수 있습니다 ( A Pixel is Not a Square 3 읽기 ). 현재 솔루션과 비슷한 속도의 솔루션도 있으며 이러한 솔루션은 하드웨어 래스터 화 파이프 라인에서 훨씬 쉽게 수행 할 수 있습니다 (이 문제를 피하기 위해 빌드 되었기 때문에 GPU에서이 오류는 거의 발생하지 않습니다).
이것은 비용이없는 문제도 아닙니다. 그래픽 디자인 작업을하는 많은 사람들이 컴퓨터가해야 할 문제를 해결하기 위해 여기에 겹치는 부분과 겹치는 부분이 없도록하여이 문제를 수동으로 회피하려고하는 데 많은 시간을 소비하는 사람들이 많이 있습니다. 그리고 많은 경우에 장엄한 실패. 그러나 고객은 왜 오류가 있는지 신경 쓰지 않고 수정해야합니다.
질문
오류가 어떻게 전파됩니까? 그들은 모두 같은 오류를하고 있기 때문에 알고리즘에 동일한 소스를 사용한다고 결론을 내릴 수 있습니다. 설계자가이 알고리즘을 선택하게 된 원인은 무엇입니까? 왜 3D 프로그래머 만이이 오류를 인식하고 2D 프로그래머는 그렇지 않은 동안 API 및 교육에서 그 부분을 체계화 했습니까?
이 오류가 더 이상 전파되지 않도록하는 방법은 무엇입니까?
부록 (그러나 나는 이것에 대해 묻지 않는다)
* 결함없이 수퍼 샘플링이 작동한다는 주장은 특별하며 특별한 증거가 필요합니다. 수퍼 샘플링 작업 의 핵심 은 수퍼 샘플링이 커버리지 처리를 수행하지 않는다는 것입니다. 본질적으로 수퍼 샘플러는 각 샘플을 포인트 샘플로 취급합니다. 포인트 샘플은 기본 영역을 가정하지 않으므로 발생하지 않는 곳에서 알파 비교를 일으키지 않습니다.
답변 중 하나에 설명 된대로 일관성있게 작동합니다. 일관성을 위해 정수 샘플링으로 샘플을 처리해야합니다. 이를 통해 한 번 화면 공간으로 변환 된 각 포인트가 동일한 좌표에 대해 동일한 솔루션을 얻을 수 있으며 샘플이 픽셀 경계로 2 회 음영 처리되지 않습니다. 이렇게하려면 샘플이 왼쪽 하단 샘플 인 경우 픽셀 ot가 정확하게 켜지도록 트리거하지 않을 수 있습니다 (따라서 정확한 가장자리가> vs <=로 처리되는 규칙을 만듭니다). 하나의 콘솔 그래픽 카드를 제외한 모든 것이 이와 같이 작동합니다. 추가 데이터를 캐시 할 필요가 없으며 추가 테스트를 수행 할 필요가 없습니다. 이 솔루션은 적용 범위 기반 솔루션보다 안정적이고 일반적이며 일관성 이 있습니다.
알고리즘은 약간 더 적은 코드와 약간 더 많은 샘플을 가진 원본과 정확히 동일합니다. 따라서 적용 범위 기반 알고리즘보다 많지 않으면 일관성이 있습니다. 우리는 거의 모든 다른 신호 처리 분야와 그래픽 카드 분야에서 이러한 방법을 사용했기 때문에 이것을 알고 있습니다.
이 방법에는 단점이 있습니까? 순진한 가정을한다면 조금 느려집니다. 그것은 이론적으로 적용 범위 래스터 라이저보다 빠른 점근선 동작을 가지고 있습니다. 또한 컨볼 루션 기반 효과의 사용을 구현하기가 더 어려울 수 있습니다.