개인공부/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; // 외곽선이 없는 경우 원래 픽셀 반환
    }
}

혹시나가 역시나 라고 안된다.

코드엔 문제될점이 없을텐데 돌겠다.

살려줭

 

 

 

 

과제: 단기:

 

 

장기: