개인공부/DirectX
dx-25 PixelShader /이미지연출 효과(Blur,GaussianBlur, Mosaic..etc)
코딩기계
2024. 4. 2. 13:02
수업내용:
additive효과: 뒷배경이 검은색일떄 효과적인 연출이 가능
Shader기능 (연출) 강화
흑백효과( 사망시 연출)
셰이더를 활용하여 외곽선 구현하기
앞서 배웠던 fliter쉐이더를 활용하여 외곽선 함수를 만들고 이를 적용시켰다.
float4 OutLine(float2 uv)
{
// 외곽선을 그리기 위해선 자신을 기준으로 자신의 주위(8방향)에 알파값이 0이 있으면 외곽선처리 즉 자신의 rgb값을 0으로 바꿔주자.
// 0의값이 있는지 확인하기 위해서 bool값으로 확인받기 (뒷배경은0 ,이미지는 1의 알파값을 가진다)
//
////////////////
float4 result = 0;
bool isAlphaValue = true;
for (int i = 0; i < scale; i++)
{
float2 div = (1 + i) / (float2) imageSize;
for (int j = 0; j < 8; j++)
{
float2 xy = edges[j] * div + uv;
result = map.Sample(samp, xy);
if(result.a==0)
{
isAlphaValue = false;
}
else if(result.a ==1)
{
isAlphaValue = true;
}
//그리는 위치인 result의 값이 0인지 1인지 판별한뒤 조건문으로 다시 판별
}
}
if (!isAlphaValue)
{
return float4(0, 0, 0, 1);
}
return map.Sample(samp, uv);
}
이를 직접 적용시키기 위해서
우리들의 Scene을 가져와서 이미지에 이를 적용시키려했다.
이미 Scene에 배경이 있으니 여기에 적용해봤다.
결과는 실패
뭐가 잘못되었을까.. 고민했다.
바로
valueBuffer->Get()[0] = 8;를 처리해주면 아래그림처럼 모두 시안 값으로 나온다. ( 이건 scale이 0일때 발생하는 문제라는점 확인, 신경쓸필요 없다.)
그렇다면 남은문제 아무리 scale을 키워도 테두리가 생기지않는다.
왜 안될까 생각하다가 리프레쉬겸 코드 다시 짯다.
더보기
float4 OutLine(float2 uv)
{
float4 centerPixel = map.Sample(samp, uv);
bool pixelAlphaValue = false;
// 주변 8방향에 대해서 확인
for (int i = 0; i < 8; ++i)
{
float2 neighborUV = uv + edges[i] / imageSize;
float4 neighborPixel = map.Sample(samp, neighborUV);
// 주변 픽셀 중 하나라도 투명한 경우 외곽선 그리기
if (neighborPixel.a == 0)
{
pixelAlphaValue = true;
break;
}
}
// 주변에 투명한 픽셀이 있으면 외곽선 그리기
if (pixelAlphaValue)
{
return float4(0, 1, 1, 1); // 외곽선 색상을 반환
}
else
{
return centerPixel; // 외곽선이 없는 경우 원래 픽셀 반환
}
}
혹시나가 역시나 라고 안된다.
코드엔 문제될점이 없을텐데 돌겠다.
살려줭
과제: 단기:
장기: