윤곽선 검출 다이렉트X

윤곽선 검출 셰이더를 다이렉트X 프로그램에 올려보자.

shader9.0/tutorial12/ColorConversion_edge.rfx 셰이더를 다이렉트 X 프로그램에 올려보자.
shader9.0/tutorial11/DxDemo_PostProcessing.zip 프로젝트에 윤곽선 검출 패스를 추가한다.

기본 설정

ColorConversion_edge.rfx에서 Edge 패스만 남기고 다른 패스는 삭제한다.
edge.fx로 익스포트 한다.

셰이더 자원 처리

이펙트 구조체에 edge를 추가한다.

struct ScreenEffect
{
    LPD3DXEFFECT noEffect;
    LPD3DXEFFECT grayScale;
    LPD3DXEFFECT sepia;
    LPD3DXEFFECT edge;
};
ScreenEffect gScreenEffect = { NULL, NULL, NULL, NULL};

윤곽선 리소스 해제도 추가 한다.

void ReleaseScreenEffect()
{
    //..... 윤곽선 이펙트 해제 추가
    _RELEASE_(gScreenEffect.edge);    
}

LoadAsset(  )에세 edge.fx를 로딩한다.

gScreenEffect.edge = LoadShader("edge.fx");
if(gScreenEffect.edge == NULL)
    return false;

렌더링

키가 4일때 edge 셰이더를 실행한다.

void main_OnKeydown(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
    switch (vk)
    {
    case '1':
    case '2':
    case '3':
    case '4':  //4일때는 edge 셰이더 처리
        gPostProcessIndex = vk - '0' - 1;
        break;
    }
}

RenderScene( ) 함수에서 edge 셰이더 호출을 추가한다.

else if (gPostProcessIndex == 3)
{
    useShader = gScreenEffect.edge;
}

gPixelOffset 변수를 설정한다.
gRenderScrWidth, gRenderScrHeight의 float 캐스팅 연산자를 빼면, 0이 대입되니 주의해야 한다.

HLSL에서 gPixelOffset은 float2 자료형이다. 셰이더 변수를 넘겨줄때 float4로 넘겨줘도 되나보다??

float2 gPixelOffset;

D3DXVECTOR4 pixelOffset(1 / (float)gRenderScrWidth, 1 / (float)gRenderScrHeight, 0, 0);
useShader->SetVector("gPixelOffset", &pixelOffset);

Key 4를 누르면 edge 셰이더가 실행된다.

다운로드 :    edge.rfx    DxDemo_edge.zip