현재 2D 게임을하고 있는데 현재 작업은 선택한 개체의 윤곽을 그리는 것입니다.
기본적으로 블러 셰이더를 사용하여 완전히 런타임합니다. 먼저 수직 가우시안 블러 셰이더를 사용하여 스프라이트를 그린 다음 수평 가우시안 블러 셰이더로 스프라이트를 그린 다음 스프라이트를 정상적으로 그립니다.
여기 블러 셰이더가 있습니다 : sampler TextureSampler : register (s0);
#define SAMPLE_COUNT 15
float2 SampleOffsets[SAMPLE_COUNT];
float SampleWeights[SAMPLE_COUNT];
float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 c = 0;
// Combine a number of weighted image filter taps.
for (int i = 0; i < SAMPLE_COUNT; i++)
{
c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
}
return c;
}
SampleOffets는 반올림 픽셀을 테스트 할 수있는 오프셋입니다. SampleWeights는 가우스 함수로 계산 된 가중치입니다 ( http://en.wikipedia.org/wiki/Gaussian_blur )
결과는 다음과 같습니다.
나쁘지 않고 매끄럽지 않지만 게임에서 충분히 보이지 않습니다 ...하지만 두께를 조절하고 (더 크게 만들기 위해) 알파로 페이딩하기 전에 첫 번째 불투명 한 윤곽선을 추가하고 싶습니다 (만들기 위해) 더 잘 보입니다). 그리고 가우시안 블러가 내 작업에 대해 생각한 것만 큼 좋지 않은 것 같습니다. :)
또 다른 아이디어는 .png에서 자동으로 생성하는 것입니다 (Photoshop 스크립트를 사용하여 자동으로 생성). 윤곽선 픽셀을 사용자 정의 색상으로 채우고 알파 구성 요소에 알파 값을 저장하고 다른 모든 구성 요소를 0으로 설정하면됩니다. 그런 다음 투명 픽셀을 원하는 색상으로 바꾸는 셰이더를 적용하면됩니다.
float4 PixelShaderFunction2(float2 texCoord : TEXCOORD0) : COLOR0
{
float4 color = tex2D(TextureSampler, texCoord);
float4 newColor = 0;
if (color.a == 0 && color.r != 0)
{
color.a = color.r;
// Blue outline
color.b = 1;
}
}
문제는 스프라이트에 DXT5 압축을 사용하고 있기 때문에 셰이더에 넣는 색상이 내가 쓴 것과 정확히 같은지 확신 할 수 없습니다. 그렇기 때문에 시도조차하지 않았습니다.
모든 조언을 환영합니다 :)