RGB에 박힌 체커보드를 분리합니다
ComfyUI나 웹 배경 제거 도구 중 일부는 투명 채널을 만들면서 RGB 채널에 체커보드 미리보기를 그대로 남깁니다. Unity에서 스프라이트를 렌더링하면 바이리니어 필터링 과정에서 반투명 외곽 픽셀에 체커보드 색이 섞여 하얀 테두리(Fringe)가 생깁니다. 파이썬 BFS 외곽 탐색으로 배경을 찾아 순수 알파를 만드세요.
from PIL import Image
import numpy as np
from collections import deque
def recover_clean_alpha(rgba_img):
arr = np.asarray(rgba_img).copy()
rgb = arr[..., :3]
h, w, _ = arr.shape
diff = rgb.max(axis=2) - rgb.min(axis=2)
neutral = (diff <= 12) & (rgb.min(axis=2) >= 230)
seen = np.zeros((h, w), dtype=bool)
q = deque([(0, x) for x in range(w)] + [(h-1, x) for x in range(w)])
while q:
y, x = q.popleft()
if 0 <= y < h and 0 <= x < w and not seen[y, x] and neutral[y, x]:
seen[y, x] = True
for ny, nx in ((y+1,x),(y-1,x),(y,x+1),(y,x-1)):
q.append((ny, nx))
arr[..., 3] = np.where(seen, 0, 255)
return Image.fromarray(arr)Unity Texture Importer 필수 체크
Unity로 가져온 뒤 Inspector에서 Texture Type을 Sprite (2D and UI)로 바꾸고, 반드시 Alpha Is Transparency를 켜야 합니다. 이 옵션은 투명 픽셀의 RGB를 가장 가까운 불투명 픽셀 색으로 채워(Edge Dilation) 블렌딩 검은 테두리를 방지합니다.
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
public class SpritePostProcessor : AssetPostprocessor
{
private void OnPreprocessTexture()
{
if (!assetPath.Contains("Art/Sprites/")) return;
TextureImporter importer = (TextureImporter)assetImporter;
importer.textureType = TextureImporterType.Sprite;
importer.alphaIsTransparency = true;
importer.mipmapEnabled = false;
importer.wrapMode = TextureWrapMode.Clamp;
}
}
#endif하단 기준점 정렬
대화창이나 바닥에 서는 캐릭터 스프라이트는 생성 시점마다 세로 여백이 제각각입니다. 알파 복구 단계에서 불투명 픽셀의 바닥 좌표를 캔버스 최하단으로 맞추는 정렬을 거치면 Pivot을 Bottom Center로 통일할 수 있습니다.
검증 범위
공식 문서 대조
검증일
Unity 공식 문서와 본문의 코드·절차를 대조해 공개 준비 상태로 전환했습니다. 별도 Unity 프로젝트나 실기기에서 직접 재현한 결과는 아니며, 특정 버전·기기 문의가 들어오면 해당 환경에서 후속 확인합니다.
확인한 공식 문서Unity 스프라이트 텍스처 매뉴얼 ↗