프로그래밍 2019. 9. 6. 00:32
728x90

쉐이더 외곽선 구현 3장

 

우리가 RT 에 단색으로 오브젝트를 그릴때,

일단은 alpha 값은 신경쓰지 않았다

 

자, 이 alpha 에 적당한 값을 넣어두자

(물론 0은 안된다, 0을 넣으면 draw 가 무시되기 때문에, RT에 아무것도 남지않는다)

0보다 크고 1보다 작은 아무값이나 넣으면 되겠다

(추후 RT2를 만들때, 알파값 비교를 위해서,

RT2를 그릴때, RT의 알파값이 1보다 작으면 색상참고만 하고, 실제 RT2영역에 남기지는 않을것이다)

 

RT2 를 열고,

RT 를 texture 로 지정하여 그릴때

 

float4 PS_OutLine( VS_OUTPUT _In ) : COLOR
{
    float4 vTex = float4(0,0,0,0);
    float4 vTex2 = float4(0,0,0,0);

    for( int i=0; i<9; i++ )
    {
        vTex = tex2D( RT, _In.uv + _vUVOffset9[i].xy );
        if( vTex.r > 0 || vTex.g > 0 || vTex.b > 0 )
        {
             vTex2 = tex2D( RT, _In.uv );
             if( 
                  vTex2.a < 1.f &&
                  (vTex2.r > 0 || vTex2.g > 0 || vTex2.b > 0)
               )
               //이미 색상을 가진, 원래 이미지 영역이라면( 알파값이 1보다 작다 ), 빼주어야 하니까
              {
                   vTex.a = 0.f;
              }
              else
              //새로 확장된 픽셀만을 남긴다, 이부분이 외곽선이 된다
             {
                  vTex.a = 1.f;
             } 

             return vTex;
         }
    }

    return float4(0,0,0,0);
}

 

최종화면에서 합성할때는,

//OutLine
if( _bOutLineDraw )
{
    float4 vOutLine = tex2D( Samp_Texture_OutLine, UV );
    orig.rgb += ( vOutLine.rgb * vOutLine.a );
}

 

코드가 간단해서,

어렵지 않다

 

확장된 영역만을 남기고, 원래 부분을 빼주는 것은

여러분이, 여러가지 방법으로 구현해줄수 있을 것이다

 

 

 

스샷의 외곽선은 1pixel 이다,

실제 게임 안에서 테스트를 해보니, 1pixle 로는 화면이 밝을때는 잘 보이지 않는 문제가 있어서

외곽선을 좀더 두껍게 해줄필요성이 생겼다

 

외곽선을 좀더 두껍게 만들어주기 위해서는 RT2 를 열고 그리는 과정을 2번, 3번 반복해주면 된다

반복이 많아질수록 외곽선이 두꺼워진다

 

첫번째 RT2 draw 끝내고,

texturecopy 를 해서 RT2 의 이미지를 RT 로 복사해준다

다시 RT2 draw 

 

RT2 draw 를 딱 두번해주니,

너무 두껍지도 않고, 적당한 외곽선을 얻을수 있었다

만족한다

 

 

이상 외곽선 만들기 끄~~~읏

 

 

PS. 게임안에서 사용할때는,

잘 알고 있겠지만!

아웃라인이 필요한 오브젝트가 생길때만, outline RT 처리를 해주자

(외곽선이 필요한 오브젝트가 없을때, 굳이 외곽선 RT를 만들고 RT2를 렌더링해줄 필요는 없다, 당연하지만,)

꼭 이런 방어 처리를 해주자

이런 처리를 해주는것이, 쓸데없는 프레임저하를 막아준다

728x90

'프로그래밍' 카테고리의 다른 글

fps 뷰 투사체 쏘기 - 2장  (0) 2019.10.18
fps 뷰 투사체 쏘기 - 1장  (0) 2019.10.18
쉐이더 외곽선 구현 2장  (0) 2019.09.06
쉐이더 외곽선 구현 1장  (0) 2019.09.05
스팀(steam) -> 게임 패치는 이렇게  (0) 2018.05.01
posted by BK dddDang
: