수업내용:
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; // 외곽선이 없는 경우 원래 픽셀 반환
}
}
혹시나가 역시나 라고 안된다.
코드엔 문제될점이 없을텐데 돌겠다.
살려줭
과제: 단기:
장기:
'개인공부 > DirectX' 카테고리의 다른 글
dx_31일차 공부 (0) | 2024.04.12 |
---|---|
dx_24일차_effect / Attack (0) | 2024.04.01 |
dx_23일차_Action (0) | 2024.03.29 |
dx_22일차 Action_MapEditor (0) | 2024.03.28 |
DirectX 21일차_ Action / Animation (0) | 2024.03.27 |