답변:
이 작업을 수행하는 가장 쉬운 방법은 (실제로 성능에 묶여 있지 않는 한 가장 좋은 방법 일 것입니다) 스프라이트 사본 두 개를 갖는 것입니다.
"지방"버전을 사용하여 전체 객체를 그린 다음 맨 위에 일반 버전을 그립니다.
"지방"버전을 흰색으로 만들면 SpriteBatch의 내장 색상 색조를 사용하여 선택 색상을 동적으로 변경할 수 있습니다.
"뚱뚱한"버전을 생성하려면 원본 스프라이트를 자동으로 가져와 알파 채널을 읽고 각 픽셀 주위의 원본 이미지에서 최대 알파 채널을 샘플링하여 새로운 알파 채널을 생성 하는 콘텐츠 파이프 라인 확장 프로그램 을 작성하는 것이 좋습니다 . RGB = (1,1,1) 설정.
스프라이트에 모두 윤곽선을 추가하기에 충분한 투명 테두리가 있는지 확인해야합니다 (컨텐츠 프로세서에서이를 확인할 수 있으며 필요한 경우 공간을 만들 수도 있음).
스프라이트가 거의없는 경우 좋은 이미지 편집기 (GIMP, Photoshop)를 사용하여 수동으로 수행 할 수 있습니다. 알파 채널 선택, 선택 확장, 알파 선택, 색상 채널 흰색 채우기.
각각의 오브젝트를 하나의 스프라이트에 먼저 그려야한다고 생각합니다. 그런 다음 스프라이트의 가장자리를 감지하여 가장자리를 찾을 때마다 픽셀을 그리는 쉐이더를 작성해야한다고 생각합니다. 이미 사용하고 있거나 포팅 할 수있는 셰이더가 이미 있어야합니다.
요구 사항에 따라 스프라이트에 대한 주문형 개요를 만드는 것이 효과적 일 수도 있습니다. 나는 스프라이트가 투명성을 가지고 있고 직사각형이 아닌 불규칙한 모양이라고 가정합니다 (이것은 잘 작동하지만 개요 직사각형은 사소해야합니다).
when selected:
outline = new sprite canvas of appropriate size
for sprite in object:
# use larger numbers for thicker outlines
for x in (-1, 0, 1) and y in (-1, 0, 1):
render sprite mask into canvas at x,y with desired color
매번 그릴 때마다이 작업을 수행 할 필요는 없지만 스프라이트를 전환 할 때 새 윤곽선 스프라이트를 만들면됩니다.
가장 간단한 무차별 접근 방식은 각 스프라이트의 사본 두 개 (일반 및 강조 표시)를 만드는 것입니다. 그런 다음 강조 표시되면 바꾸십시오.
여분의 메모리가 있다면 더 복잡 할 필요가 없습니다. 또한 아티스트는 강조 표시 될 때 모양을 완벽하게 제어 할 수 있으므로 개요 또는 원하는 다른 작업을 수행 할 수 있습니다.
각 스프라이트마다 기본 스프라이트의 개요 인 다른 스프라이트도 있습니다. 윤곽선 개체를 그릴 때 기본 스프라이트를 그린 다음 결합 렌더링의 마스크를 만든 다음 마스크를 제외한 윤곽 스프라이트를 그립니다.
다른 장단점이있는 몇 가지 솔루션.
가장 쉬운 방법 : 평면 색상을 여러 번 사용하여 객체를 렌더링하고 위치 (왼쪽, 위, 아래, 오른쪽 등 오프셋)를 흔들면 그 위에 렌더링 한 모든 버전의 개요 버전이 생성되지만 성능 비용이 발생하지는 않습니다. 추가 렌더링을 많이하지 않고도 굵은 테두리를 만들 수 있습니다. 하나 또는 두 개의 픽셀 테두리는 4x로 괜찮을 수 있습니다.
가장 빠름 : 텍스처를 사전 처리하고 이미 테두리가 있거나 복사본이거나 복사본이거나 음영이있는 회색조 8 비트 마스크입니다. 이것은 메모리 비용으로 빠를 것입니다.
최선 : 내 의견이지만 객체의 부호있는 거리 필드 (SDF) 표현을 생성하는 것이 가장 좋은 해결책 일 것입니다. 이 텍스처는 소스 텍스처보다 훨씬 작을 수 있으며 여전히 유용한 데이터를 캡처합니다. 기본적으로 각 픽셀은 픽셀을 생성하는 데 사용 된 객체에서 얼마나 멀리 떨어져 있는지 인코딩합니다. 이 데이터를 활용하면 광선에서 윤곽선까지 모든 종류의 효과를 쓸 수 있습니다. 테두리의 크기와 색상 등이 변경 될 수 있으며 여전히 비교적 저렴한 셰이더이며 하나의 추가 추첨입니다. 단점은 툴링 및 전처리입니다.
효율성은 확실하지 않지만 가장 쉽게 볼 수있는 방법은 먼저 선택한 색상으로 더 큰 버전의 스프라이트를 그리는 것입니다. 그 위에 스프라이트를 그립니다. 첫 번째 스프라이트의 가장자리 만 보이므로 선택 효과가 나타납니다.
편집 : 그러나 주석에서 볼 수 있듯이 이것은 좋은 생각이 아닙니다.
스프라이트 확장에 동의합니다. 지금까지 가장 쉬운 경로이며, 특히이 목적을 위해 추가 스프라이트를 만들지 않고도 모든 스프라이트를 선택하는 데 적용 할 수 있습니다.