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

쉐이더 외곽선 구현 2장

 

일단, 스케일에서 막히자

미리 생각은 해보고있던 후처리 샘플링 방식을 좀더 구체적으로 고려해 보았다

 

주변의 픽셀의 색상을 더해서, 이미지를 그려주면,

당연히 이미지의 외곽을 확장시킬수 있다

샘플링 범위를 넓게 줄수록, 외곽을 좀더 두껍게 만들수 있을 것이고...

 

화면이미지를 스케일링해서 렌더링하는 것보다는

조금 더 복잡하고, 

렌더링 부하를 더 잡아먹기 때문에

왠만하면, 스케일로 처리해보고 싶었다는 것이지...

 

걍, 스케일로 어떻게 확장이 해결이 되었으면 좋았는데,

쳇 귀찮군...

나는 궁시렁 거리면서, 작업을 했다

 

RT2 열고 clear

- RT 이미지를 텍스쳐로 사용하여 draw 해준다

 

PS()

{

float4 vTex = float4(0,0,0,0);

for( int i=0; i<9; i++ )
    vTex += tex2D( RT, uv + _vUVOffset9[i].xy );

vTex.rgb /= 9;
return vTex;

}

 

RT2 닫고

 

테스트는 최종화면 PS()에서

orig.rgb += tex2D( RT2, uv );

로 출력을 확인

 

_vUVOffset9 는 자신을 둘러싼 8개의 pixel 의 uv offset 을 만들어 둔것이다

대략 이런 방식인데, 보면 알것이다

 

void SetUVOffsetRect( DWORD _dwWidth, DWORD _dwHeight )
{
float tU = 1.0f / (float)_dwWidth;
float tV = 1.0f / (float)_dwHeight;

g_vUVOffset9[0].x = -tU;
g_vUVOffset9[0].y = -tV;

g_vUVOffset9[1].x = 0;
g_vUVOffset9[1].y = -tV;

g_vUVOffset9[2].x = tU;
g_vUVOffset9[2].y = -tV;

g_vUVOffset9[3].x = -tU;
g_vUVOffset9[3].y = 0;

g_vUVOffset9[4].x = 0;
g_vUVOffset9[4].y = 0;

g_vUVOffset9[5].x = tU;
g_vUVOffset9[5].y = 0;

g_vUVOffset9[6].x = -tU;
g_vUVOffset9[6].y = tV;

g_vUVOffset9[7].x = 0;
g_vUVOffset9[7].y = tV;

g_vUVOffset9[8].x = tU;
g_vUVOffset9[8].y = tV;
}

 

출력 확인을 하면 1pixel 씩 외곽으로, 확장되어 있다

물론, 샘플링을 할때, 색상을 전부 더해서 나누어 주었기때문에, 색상은 흐릿해졌을 것이다

 

자, 그러면은 샘플링을 할때, 색상을 처리하는 방식만 조금 바꾸어도

외곽색상을 보전할수 있다

 

for( int i=0; i<9; i++ )
{
    vTex = tex2D( RT, uv + _vUVOffset9[i].xy );
    if( vTex.r > 0 || vTex.g > 0 || vTex.b > 0 ) //주변 픽셀 중, 색상이 있으면 그대로 그색을 사용
    {

        return vTex;

    }

}

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

 

정확히 1 pixel 이 확장된 결과를 얻었다

 

이제 남은 것은, 확장된 픽셀의 색상값만을 남기고, 원래의 색상값은 그리지 않는 것인데,

...

간단하다

 

어라라라,

쓰다보니 생각보다는 양이 많군,

 

3장으로~

 

 

728x90
posted by BK dddDang
: