편집 : 구체적인 솔루션으로 다른 답변을 참조하십시오.
나는 1 년 전에 나의 석사 논문에서이 정확한 문제를 해결했다. 밸브 페이퍼에서, 그들은 당신이 이것을 달성하기 위해 두 개의 거리 필드를 가질 수 있고 볼록 코너가 하나만있는 한 작동한다는 것을 보여줍니다. 오목한 모서리에는 OR 연산도 필요합니다. 이 사람은 실제로 네 개의 텍스처 채널을 사용하여 두 작업 사이를 전환하는 모호한 시스템을 개발했습니다.
그러나 상황에 따라 AND와 OR을 모두 촉진 할 수있는 훨씬 간단한 연산이 있으며 이것이 제 논문의 주요 아이디어 인 3의 중앙값입니다 . 따라서 기본적으로 정확히 3 개의 채널 (RGB에 이상적)을 사용하고 완전히 교환 할 수 있으며 중간 연산을 사용하여 결합합니다 (3 개 중 중간 값 선택).
앤티 앨리어싱을 수용하기 위해 부울 만 사용하는 것이 아니라 부동 소수점 값을 사용하여 AND 연산이 최소가되고 OR이 최대 값이됩니다. 세 가지의 메디안 실제로 모두를 수행 할 수 있다면 < b를 위해 ( A는 , A는 , B ), 중앙값이 최소이며, 경우 ( A는 , B는 , B )는 최대이다.
렌더링 프로세스는 여전히 매우 간단합니다. 앤티 앨리어싱을 포함한 전체 조각 셰이더는 다음과 같습니다.
int main() {
// Bilinear sampling of the distance field
vec3 s = texture2D(sdf, p).rgb;
// Acquire the signed distance
float d = median(s.r, s.g, s.b) - 0.5;
// Weight between inside and outside (anti-aliasing)
float w = clamp(d/fwidth(d) + 0.5, 0.0, 1.0);
// Combining the background and foreground color
gl_FragColor = mix(outsideColor, insideColor, w);
}
따라서 원래 방법과의 유일한 차이점은 텍스처를 샘플링 한 직후 중앙값을 계산하는 것입니다. 그래도 중간 함수를 구현해야합니다. 중앙 함수는 4 분 / 최대 작업으로 수행 할 수 있습니다 .
물론 문제는 어떻게 이러한 3 채널 거리 필드를 구축 할 것인가입니다.그리고 이것은 까다로운 부분입니다. 처음에 취한 가장 확실한 접근 방식은 입력 모양 / 문자 모양을 세 가지 구성 요소로 분해 한 다음 각각의 거리 필드를 생성하는 것입니다. 이 분해에 대한 규칙은 그렇게 복잡하지 않습니다. 먼저, 3 개 중 2 개 이상의 채널이 켜져있는 영역이 내부입니다. 그런 다음 RGB 색상 채널로 생각하면 볼록한 모서리는 2 차 색상으로 만들어 져야하며 2 개의 기본 구성 요소는 바깥쪽으로 계속됩니다. 오목한 모서리는 그 반대입니다. 두 개의 보조 색상이 공통 기본 색상을 둘러싸고 두 가장자리가 안쪽으로 계속 연결되는 쐐기가 흰색입니다. 또한 2 차 원색 또는 2 차 2 차 색상이 인공물을 피하기 위해 닿는 부분 (예 : "N"
다음 이미지는 내 논문에서 프로그램에 의해 생성 된 분해 예입니다.
그러나이 방법에는 몇 가지 단점이 있습니다. 그중 하나는 윤곽선 및 그림자와 같은 특수 효과가 더 이상 올바르게 작동하지 않는다는 것입니다. Fortunatelly, 나는 또한 거리 필드를 직접 생성하고 모든 그래픽 효과를 지원하는 훨씬 더 우아한 두 번째 방법을 고안했습니다. 또한 논문에 포함되어 있으며 1 년이 넘었습니다. 현재이 두 번째 기법에 대해 자세히 설명하는 논문을 작성하고 있기 때문에 더 이상 자세한 내용은 밝히지 않겠습니다. 그러나 완료 되 자마자 여기에 게시하겠습니다.
어쨌든, 여기에 품질 차이의 예가 있습니다. 텍스처 해상도는 각 이미지에서 동일하지만 왼쪽은 일반 텍스처를 사용하고 가운데는 일반 거리 필드를 사용하며 오른쪽은 3 채널 거리 필드를 사용합니다. 성능 오버 헤드는 RGB 텍스처와 흑백 텍스처 사이의 차이입니다.