À±°û¼± °ËÃâ ´ÙÀÌ·ºÆ®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 ij½ºÆà ¿¬»êÀÚ¸¦ »©¸é, 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