MRT

MRT ¼³¸íÀº http://marupeke296.com/DXG_No50_MultiPassRendering.html ³»¿ëÀ» °¡Áö°í ¿Í¼­ Á¤¸®ÇÑ°ÍÀÌ´Ù.

MRT´Â Multiple Render TargetÀÇ ¾àÀÚ·Î ±×·¡ÇÈ Ä«µå´Â ¿©·¯°³ÀÇ ·»´õŸ°ÙÀ» °¡Áú¼ö ÀÖ´Ù.
Áö¿¬ ·»´õ¸µÀ» À§Çؼ­´Â MRT¸¦ ÀÌÇØ ÇؾßÇÑ´Ù.

1. ·»´õŸ°Ù ÃÖ´ë °¹¼ö üũ

ÀÚ½ÅÀÇ GPU°¡ ÃÖ´ë ¸î°³ÀÇ ·»´õŸ°ÙÀ» Áö¿øÇÏ´ÂÁö üũÇÑ´Ù.

   D3DCAPS9 Caps;
   g_pD3DDev->GetDeviceCaps( &Caps );
   DWORD RT = Caps.NumSimultaneousRTs;

2. ·»´õ Ÿ°Ù ¼³Á¤


ù¹ø° ÀÎÀÚ·Î ·»´õ Ÿ°ÙÀ» ÁöÁ¤ÇÏ°í, ·»´õ Ÿ°ÙÀÇ ¼­Çǽº¸¦ ³Ñ°ÜÁØ´Ù.

HRESULT SetRenderTarget ( DWORD RenderTargetIndex, Direct3DSurface9 *pRenderTarget);

3. ·»´õ Ÿ°Ù »ý¼º ¼ø¼­


D3DUSAGE_RENDERTARGET·Î ·»´õŸ°Ù ÅؽºÃĸ¦ ¸¸µç´Ù.
·»´õŸ°Ù ÅؽºÃÄÀÇ Ç¥¸éÀ» ¾ò¾î¿Â´Ù.
·»´õŸ°Ù ÅؽºÃÄÀÇ Ç¥¸éÀ¸·Î ·»´õŸ°ÙÀ» ¼³Á¤ÇÑ´Ù.

IDirect3DTexture9 *pAlphaTex = 0;
IDirect3DSurface9 *pAlphaSurf = 0;

g_pD3DDev->CreateTexture( 640, 480, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pAlphaTex, 0 );
pAlphaTex->GetSurfaceLevel( 0, &pAlphaSurf );
g_pD3DDev->SetRenderTarget( 1, pAlphaSurf );

4. ¹é¹öÆÛ ¾ò¾î¿À±â


0¹ø À妽º¿¡ SetRenderTarget Çϱâ Àü¿¡ GetRenderTargetÀ¸·Î ±âÁ¸ÀÇ ¼­Çǽº¸¦ ¹Ì¸® ±¸ÇØ ³õ´Â´Ù.

IDirect3DSurface9 *pBackBuffer = 0;
g_pD3DDev->GetRenderTarget( 0, &pBackBuffer );

5. HLSL¿¡¼­ ÁöÁ¤ÇÑ ·»´õŸ°Ù¿¡ ±×¸®±â


¿øÇÏ´Â ·»´õŸ°Ù¿¡ ±×¸®±â À§Çؼ­´Â ¼ÎÀÌ´õ¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù.
Çȼ¿¼¼ÀÌ´õ¿¡¼­ COLOR[n]À¸·Î Á¢±Ù ÇÑ´Ù.

·»´õ Ÿ°Ù 0¹ø¿¡ ±×¸®´Â °æ¿ì
float4 Test_PS (float2 texCoord : TEXCOORD0) : COLOR0
{
   float outColor
   // .....
   return outColor;
}

·»´õ Ÿ°Ù 1¹ø¿¡ ±×¸®´Â °æ¿ì
float4 Test_PS (float2 texCoord : TEXCOORD0) : COLOR1
{
   float outColor
   // .....
   return outColor;
}

·»´õ Ÿ°Ù 0¹ø°ú 1¹ø µ¿½Ã¿¡ ±×¸®´Â °æ¿ì
struct OUTPUT_PS {
   float4 color0 : COLOR0;
   float4 color1 : COLOR1;
};

OutPS Test_PS( float2 texCoord : TEXCOORD0 )
{
   OutPS outColor
   // ....
   return outColor;
}

·»´õ Ÿ°Ù °¹¼ö¿¡ µû¶ó OUTPUT_PS ±¸Á¶Ã¼¿¡ color[n]À» ´Ã¸®¸é µÈ´Ù.

6. HLSL¿¡¼­ MRT ¿¹Á¦


ºñÇà±â¸¦ RGBA »ö»ó°ú ¾ËÆÄ°ªÀ¸·Î ºÐ¸®ÇÏ¿© º°µµÀÇ ÅؽºÃ³¿¡ Çѹø¿¡ ±×¸®°í ÀÖ´Ù.
°á°ú¸¦ RGBA --> ¾ËÆÄ°ªÀ¸·Î ¹Ù²Ù¸é¼­ È­¸é¿¡ º¸¿©ÁØ´Ù.

//RGBAndAlphaMPR.fx
float4x4 WVP;   // WorldViewProjection Matrix
texture Tex;    // Texture
sampler2D TexSampler = sampler_state {    Texture = (Tex); };

struct OUTPUT_VS
{
    float4 pos      : POSITION;
    float2 texCoord : TEXCOORD0;
};

struct OUTPUT_PS
{
    float4 color : COLOR0;
    float4 alpha : COLOR1;
};

OUTPUT_VS SimpleVS( float4 inPos : POSITION, float2 inTexCoord : TEXCOORD0 )
{
    OUTPUT_VS outVS = (OUTPUT_VS)0;
    outVS.pos = mul( inPos, WVP );
    outVS.texCoord = inTexCoord;
    return outVS;
}

OUTPUT_PS RGBAndAlphaMPR_PS( float2 texCoord : TEXCOORD0 )
{
    OUTPUT_PS PSout = (OUTPUT_PS)0;
    PSout.color = tex2D(TexSampler, texCoord);
    PSout.alpha = PSout.color.a;
    PSout.alpha.a = 1.0f;    
    return PSout;
}

Åõ¸í ÅؽºÃĸ¦ ó¸®Çϱâ À§ÇØ ·»´õ¸µ ½ºÅ×ÀÌÆ®¸¦ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.

//RGBAndAlphaMPR.fx
technique RGBAndAlphaMPR
{
    pass p0
    {
        //·»´õ¸µ ½ºÅ×ÀÌÆ® ¼³Á¤
        AlphaBlendEnable = TRUE;
        SrcBlend = SRCALPHA;
        DestBlend = INVSRCALPHA;
        ColorOp[0] = SELECTARG1;
        ColorArg1[0] = TEXTURE;
        ColorArg2[0] = DIFFUSE;
        AlphaOp[0] = SELECTARG1;
        AlphaArg1[0] = TEXTURE;
        AlphaArg2[0] = DIFFUSE;
        ColorOp[1] = DISABLE;
        AlphaOp[1] = DISABLE;

        //½¦ÀÌ´õ
        VertexShader = compile vs_2_0 SimpleVS();
        PixelShader = compile ps_2_0 RGBAndAlphaMPR_PS();
    }
}

½ÇÇà °á°ú : µÎ°³ÀÇ À̹ÌÁö°¡ ±³Ã¼ µÈ´Ù.





ºñÁê¾ó½ºÆ©µð¿À¿¡¼­ hlsl ¿¡·¯ ¹ß»ýÇÒ¶§

ºñÁê¾ó½ºÆ©µð¿À 2013¿¡¼­ ÇÁ·ÎÁ§Æ®¿¡ FX ÆÄÀÏÀ» Ãß°¡ ÈÄ ºôµåÇÏ¸é ´ÙÀ½ÀÇ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

error X3501: 'main': entrypoint not found

ºñÁê¾ó½ºÆ©µð¿À 2012 ÀÌÈÄ ¹öÀü¿¡¼­ ÀÌ ¿¡·¯¸¦ ¾ø¾Ö±â À§Çؼ­´Â ÇÁ·ÎÁ§Æ® ¼Ó¼º "HLSL Compiler"¿¡¼­ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ ÇÑ´Ù.

ÇÁ·ÎÁ§Æ® ¼Ó¼º > ±¸¼º ¼Ó¼º > HLSL ÄÄÆÄÀÏ·¯ > ÀϹݠ  À̵¿
¼ÎÀÌ´õ Çü½ÄÀ» "È¿°ú(/fx)", ¼ÎÀÌ´õ ¸ðµ¨À» Àû´çÇÑ°É·Î ¼±ÅÃÇÑ´Ù.



¼Ò½º :
main.cpp
RGBAndAlphaMPR.fx
mrt_vs2013.zip


ÂüÁ¶ )
http://marupeke296.com/DXG_No50_MultiPassRendering.html