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
|