¸Þ¸ðÀå_D3D
@ 2004-06-16 @
- 1 ±âŸ
- 2 DirectX
- 2.1 ¿ùµåÁÂÇ¥°èÀÇ ÇÁ·¯½ºÅÒ(Frustum) ÁÂÇ¥ ±¸Çϱâ
- 2.2 VS2005, DirectX SDK »ç¿ëÀ» À§ÇÑ ¼³Á¤
- 2.3 DirectX ¹öÀüº° dll
- 3 ¸Þ¸ð¸® °ü·Ã
- 3.1 AGP ¸Þ¸ð¸®¿Í ºñµð¿À ¸Þ¸ð¸®
- 3.2 ºñµð¿À ¸Þ¸ð¸® ÀÜ·®À» ½Ç½Ã°£À¸·Î ÃøÁ¤(GPGstudy¿¡ ¿Ã·ÁÁø ±Û Á¤¸®)
- 3.3 Windows ÀÛ¾÷ °ü¸®ÀÚ
- 4 D3DX ÇÔ¼ö
- 4.1 ȸé Å©±â ±¸ÇÏ´Â ¹ý
- 4.1.1 ½Ã½ºÅÛ Á¤º¸¸¦ Ãâ·ÂÇÏ´Â ¹æ¹ý ; µà¾ó¸ð´ÏÅÍÀÇ ¸ð´ÏÅÍ »çÀÌÁî
- 4.2 D3DX ±âÇϹ°Ã¼
- 4.3 HRESULT D3DXSaveSurfaceToFile( ..., D3DXIMAGE_FILEFORMAT, ... );
- 4.4 D3DXCheckVersion - D3D ¹öÀü È®ÀÎÇϱâ
- 4.5 OSVERSIONINFOEX Structure (Windows)¸¦ ÀÌ¿ëÇÑ ¹öÀü È®ÀÎ
- 4.6 Rendering °ü·Ã ¼³Á¤, Log ÆÄÀÏ·Î ÀúÀå
- 5 Display
- 5.1 ¸Ê2ÀåÀ» »ç¿ëÇÑ ¹ý¼± ¸ÊÇÎ
- 5.2 ¾ËÆÄºí·»µù
- 5.3 Ä¿¼¸¦ ¸¶À½´ë·Î...
- 5.4 D3D 9.0 ±ÛÀÚ¾²±â(±ÔÁø¿¡°Ô °¨»ç)
- 5.5 Depth Buffer ºñ±³ ¿É¼Ç ¹Ù²Ù±â
- 5.6 Quaternion
|
1 ±âŸ #
¢¹ ƯÁ¤ °ÔÀÓ¿¡¼ ÇÑ±Û ÀÔ·ÂÀÇ ¹®Á¦
-. Windows 7 (64 ºñÆ®) ¼³Ä¡½Ã ¼³Á¤µÈ 'Microsoft office IME 2007'¿¡¼ ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾ÊÀ½
-. º°µµ·Î ¹Þ¾Æ¼ ¼³Ä¡ÇÑ 'ÇѱÛÀԷ½ýºÅÛ(MS-
IME2002)'¿¡¼´Â ÇÑ/¿µ º¯È¯Å°°¡ ÀÛµ¿ÇÏÁö ¾Ê°í, ÇѱÛÀÌ ÀԷµÇÁö ¾Ê´Â Çö»ó ¹ß°ß
#define
DEG2RAD 0.01745f
#pragma once
//-----------------------------------------------------------------------------
// Miscellaneous helper functions
//-----------------------------------------------------------------------------
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
//-----------------------------------------------------------------------------
// General purpose utilities
//-----------------------------------------------------------------------------
d3dx9math.h
#define D3DX_PI ((float) 3.141592654f)
#define D3DX_1BYPI ((float) 0.318309886f)
#define
D3DXToRadian( degree ) ((degree) * (D3DX_PI / 180.0f))
#define
D3DXToDegree( radian ) ((radian) * (180.0f / D3DX_PI))
*
D3DXCreateTextureFromFileEx() µîÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÒ¶§
FormatÀ» D3DFMT_UNKNOWN À¸·Î ÁöÁ¤ÇÏ¸é ·Îµù ¼Óµµ°¡ ´À·ÁÁö´Â °æ¿ìµµ ÀÖ´Ù.
*
D3D ¸ÅÅ©·Î ÀÌ¿ë
/// ´ÜÃàÇü ¸ÅÅ©·Î
#define RS m_pd3dDevice->
SetRenderState
#define TSS m_pd3dDevice->
SetTextureStageState
#define SAMP m_pd3dDevice->
SetSamplerState
/// ·»´õ¸µ »óÅ ¼³Á¤
RS( D3DRS_DITHERENABLE, FALSE );
RS( D3DRS_SPECULARENABLE, FALSE );
RS( D3DRS_ZENABLE, TRUE );
RS( D3DRS_AMBIENT, 0x000
F0F0F );
/// ÅؽºÃ³¿¡ °üÇÑ ¼³Á¤
TSS( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
TSS( 0, D3DTSS_
COLORARG1, D3DTA_TEXTURE );
TSS( 0, D3DTSS_
COLORARG2, D3DTA_DIFFUSE );
* BOOL Á¤ÀÇ
// Standard constants
#define FALSE 0
#define TRUE 1
#define NULL 0
// Success codes
#define S_OK ((HRESULT)0x00000000L)
#define S_FALSE ((HRESULT)0x00000001L)
* ·»´õ¸µ »óÅ°ª Á¶Á¤
Device->
SetRenderState( D3DRS_SHADEMODE, D3DSHADE_GOURAUD );
Device->
SetRenderState( D3DRS_SPECULARENABLE, true ); // µðÆúÆ®´Â ²¨Á®ÀÖÀ½
Device->
SetRenderState( D3DRS_NORMALIZENORMALS, true ); // ³ë¸»°ªÀÌ ¿Ö°îµÇ´Â Çö»óÀ» ¹æÁöÇϱâ À§ÇØ,
Direct3D°¡ ¸ðµç ³ë¸»°ªÀ» ´Ù½Ã Á¤¸®Çϵµ·Ï ÇÑ´Ù.
* ÇÔ¼ö...
#.
D3DXPlaneFromPoints(
D3DXPLANE * pOut, CONST
D3DXVECTOR3 *pV1, CONST
D3DXVECTOR3 *pV2, CONST
D3DXVECTOR3 *pV3);
¼¼ Á¡À¸·ÎºÎÅÍ Æò¸éÀÇ ¹æÁ¤½ÄÀ» ±¸ÇÏ´Â ÇÔ¼ö
#.
D3DXVec3TransformCoord ÇÔ¼ö; ÁöÁ¤µÈ Çà·Ä¿¡ ÀÇÇØ 3D º¤Å͸¦ º¯È¯ ÇØ, ±× °á°ú¸¦ w = 1 ¿¡ Åõ¿µ ÇÑ´Ù.
pOut - ¿¬»ê °á°úÀÎ
D3DXVECTOR3 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
pV - ó¸®ÀÇ ±âº»À¸·Î µÇ´Â
D3DXVECTOR3 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
#.
D3DXVec3Transform ÇÔ¼ö; ÁöÁ¤µÈ Çà·Ä¿¡ ÀÇÇØ º¤ÅÍ (x, y, z, 1)¸¦ º¯È¯ ÇÑ´Ù.
pOut - ¿¬»ê °á°úÀÎ
D3DXVECTOR4 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
pV - ó¸®ÀÇ ±âº»À¸·Î µÇ´Â
D3DXVECTOR3 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
#.
D3DXVec4Transform ÇÔ¼ö; ÁöÁ¤µÈ Çà·Ä¿¡ ÀÇÇØ 4D º¤Å͸¦ º¯È¯ ÇÑ´Ù.
pOut - ¿¬»ê °á°úÀÎ
D3DXVECTOR4 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
pV - ó¸®ÀÇ ±âº»À¸·Î µÇ´Â
D3DXVECTOR4 ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
2 DirectX #
¢¹
D3DXMatrixRotationYawPitchRoll ÇÔ¼ö´Â ȸÀüÀ¸·Î Çà·ÄÀ» ¸¸µé ¶§,
Roll (Z) * Pitch(X) * Yaw(Y) ¼ø¼·Î °è»ê
¢¹ ¿À¸¥¼Õ ÁÂÇ¥°è¿¡¼´Â
Yaw´Â ZÃà¿¡ ´ëÇÑ ¹Ý½Ã°è¹æÇâ ȸÀü
Pitch´Â YÃà¿¡ ´ëÇÑ ¹Ý½Ã°è¹æÇâ ȸÀü
RollÀº XÃà¿¡ ´ëÇÑ ¹Ý½Ã°è¹æÇâ ȸÀü
°í·Î, Z * Y * X ¼øÀ¸·Î °öÇÏ¿© ȸÀü Çà·Ä½ÄÀ» ¸¸µç´Ù.
¢¹
SetRenderState( D3DRS_DEPTHBIAS , value );
DEPTHBIAS(z-bias)´Â °°Àº ±íÀÌ¿¡ ÀÖ´Â µÎ Æú¸®°ï »çÀÌ¿¡¼ ÀϾ´Â Z-fightingÀ» ¸·±âÀ§ÇØ
ÀÎÀ§ÀûÀ¸·Î DEPTH(z)°ªÀ» Á¶Á¤ÇØÁÖ´Â ¼öÄ¡·Î,
ÁöÇü±×¸±¶§ 0°ªÀ» ¼ÂÆÃÇÏ°í µ¥Ä® ±×¸±¶§ 1·Î ¼ÂÆÃÇؼ ÀÎÀ§ÀûÀ¸·Î °ãÄ¡´Â ºÎºÐÀÌ ÁöÀúºÐÇØ Áö´Â °ÍÀ» ¹æÁöÇÑ´Ù.
2.1 ¿ùµåÁÂÇ¥°èÀÇ ÇÁ·¯½ºÅÒ(Frustum) ÁÂÇ¥ ±¸Çϱâ #
1.·»´õ¸µ ÆÄÀÌÇÁ¶óÀÎÀ» Åë°úÇÏ´Â ÃÖÁ¾ ¹öÅؽºÀÇ º¯È¯Àº
Vertex_end = Vertex_local * Matrix_world * Matrix_view * Matrix_Proj ÀÌ´Ù.
¡ñ Vertex_world = Vertex_local * Matrix_world
Vertex_end = Vertex_world * Matrix_view * Matrix_Proj
¡ñ Matrix_
ViewProj = Matrix_view * Matrix_Proj
Vertex_end = Vertex_world * Matrix_
ViewProj
2.±¸ÇÏ°íÀÚ ÇÏ´Â ÃÖÁ¾°á°ú°¡ Vertex_world À̹ǷÎ
Vertex_world = Vertex_end * Matrix_
ViewProj^-1(Matrix_view * Matrix_ProjÀÇ ¿ªÇà·Ä)
3.ÀýµÎü(Frustum)ÀÇ Vertex_end°ªÀº (-1,-1,0) ~ (1,1,1)»çÀÌÀÇ °ªÀÓÀ¸·Î
D3DXMATRIXA16
MatrixViewProj = Matrix_view * Matrix_Proj;
D3DXMATRIXA16 MatrixViewProj_Inv =
D3DXMatrixInverse(&MatrixViewProj_Inv, NULL,
MatrixViewProj);
ÀýµÎüÀÇ Vertex_world =
D3DXVec3TransformCoord( &Vertex_world, &Vertex_end, &MatrixViewProj_Inv);
2.2 VS2005, DirectX SDK »ç¿ëÀ» À§ÇÑ ¼³Á¤ #
Microsoft
DirectX SDK (February 2007)À» ¼³Ä¡Çϸé ȯ°æº¯¼ö¿¡ ´ÙÀ½ Ç׸ñÀÌ Ãß°¡µÈ´Ù.
DXSDK_DIR=C:\Program Files\Microsoft
DirectX SDK (February 2007)\
(¹æ¹ý 1) Visual Studeo 2005ÀÇ VC++¿¡ ´ëÇؼ ¼³Á¤Çϱâ
1. Tools | Options ´ÙÀ̾ó·Î±× âÀ» ¿¬´Ù.
2. Projects and Solutions | VC++ Directories | Win32, Include files¿¡ ´ÙÀ½ Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
$(DXSDK_DIR)include
3. Projects and Solutions | VC++ Directories | Win32, Library files¿¡ ´ÙÀ½ Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
$(DXSDK_DIR)lib\x86 or $(DXSDK_DIR)lib\x64
(¹æ¹ý 2) Projectº°·Î ¼³Á¤Çϱâ
1. Project¸¦ ¼±ÅÃÇÏ°í ¿ìÃø ¸¶¿ì½º ¹öÆ°À» Ŭ¸¯ÇÑ ÈÄ Properties ´ÙÀ̾ó·Î±× âÀ» ¿¬´Ù.
2. C/C++ | General | Additional Include Directories¿¡ ´ÙÀ½ Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
$(DXSDK_DIR)include
3. Linker | General | Additional Library Directories¿¡ ´ÙÀ½ Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
$(DXSDK_DIR)lib\x86 or $(DXSDK_DIR)lib\x64
(ÁÖÀÇ) release¿Í debug¿¡ ´ëÇØ ¸ðµÎ ÇØ ÁÖ¾î¾ß ÇÑ´Ù.
2.3 DirectX ¹öÀüº° dll #
DirectX SDK Version | Release Build | Debug Build |
Direct3D 10.1 (March 2008) | d3dx9_37.dll | d3dx9d_37.dll |
Direct3D 10 (November 2007) | d3dx9_36.dll | d3dx9d_36.dll |
Direct3D 10 (August 2007) | d3dx9_35.dll | d3dx9d_35.dll |
Direct3D 10 (June 2007) | d3dx9_34.dll | d3dx9d_34.dll |
Direct3D 10 (April 2007) | d3dx9_33.dll | d3dx9d_33.dll |
Direct3D 10 (February 2007) | d3dx9_32.dll | d3dx9d_32.dll |
Direct3D 10 (December 2006) |
Direct3D 10 (October 2006) | d3dx9_31.dll | d3dx9d_31.dll |
Direct3D 10 (August 2006) | d3dx9_30.dll | d3dx9d_30.dll |
Direct3D 10 (June 2006) |
Direct3D 10 (April 2006) |
Direct3D 10 (February 2006) | d3dx9_29.dll | d3dx9d_29.dll |
Direct3D 10 (December 2005) | d3dx9_28.dll | d3dx9d_28.dll |
DirectX 9.0 Update (October 2005) | d3dx9_27.dll | d3dx9d_27.dll |
DirectX 9.0 Update (August 2005) |
DirectX 9.0 Update (June 2005) | d3dx9_26.dll | d3dx9d_26.dll |
DirectX 9.0 Update (April 2005) | d3dx9_25.dll | d3dx9d_25.dll |
DirectX 9.0 Update (February 2005) | d3dx9_24.dll | d3dx9d_24.dll |
DirectX 9.0 Update (December 2004) ÀÌÀü | StaticLinkLibraryÀ̹ǷΠ¿ÜºÎ ÀÇÁ¸ ¾øÀ½ | d3dx9d.dll |
3 ¸Þ¸ð¸® °ü·Ã #
3.1 AGP ¸Þ¸ð¸®¿Í ºñµð¿À ¸Þ¸ð¸® #
1.AGP(Accelerated Graphics Port)
1-1.»ç¿ëÀÚ´Â CMOS¿¡¼ AGP Apecture »çÀÌÁ Á÷Á¢ ÁöÁ¤ÇÒ ¼ö°¡ Àִµ¥, ¸¸¾à ÀÚ½ÅÀÇ Àüü ·¥ÀÌ 512MB¶ó¸é 128MB~256MB Á¤µµ·Î ¼³Á¤ÇÏ°í 256MB¶ó¸é 64~128MB·Î ¼³Á¤Çؼ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù(AGP »çÀÌÁ Å©°Ô ÇÒ¼ö·Ï ¸¹Àº ¸®¼Ò½º¸¦ »ç¿ëÇÏ´Â 3D °ÔÀÓµéÀÌ ¿øÈ°ÇÏ°Ô µ¹¾Æ°£´Ù). ÀÌó·³ AGP ¸Þ¸ð¸®¶ó°í Çؼ µû·Î ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó ±×³É ÀÏ¹Ý ·¥Àε¥ Ưº°È÷ ¿µ¿ªÀ» ÁöÁ¤ÇØÁÖ´Â °ÍÀÌ´Ù.
1-2. ´ÜÁö OS°¡ AGP ¸Þ¸ð¸®¸¦ Ưº°ÇÏ°Ô Ã³¸®Çϴµ¥ ¼Óµµ¸¦ À§Çؼ Ưº°È÷ Àß °ü¿©ÇÏÁö ¾Ê´Â´Ù°í º¸¸é µÈ´Ù. OS´Â ¾ÈÁ¤¼ºÀÌ ¿ì¼±À̱⠶§¹®¿¡ ÀÏ¹Ý ¸Þ¸ð¸®ÀÇ °æ¿ì ÆäÀÌ¡ 󸮺ÎÅÍ °¡»ó¸Þ¸ð¸® ó¸® ¹× OS ÅëÁ¦°¡ ½ÉÇÏÁö¸¸ AGP´Â 3D Ä«µå°¡ Á÷Á¢ ÀÐÀ» ¼ö ÀÖµµ·Ï CPU°¡ »¡¸® ¾µ ¼ö ÀÖµµ·Ï ¼³°èµÇ¾î ÀÖ´Ù.
1-3. AGPÀÇ Æ¯¼º
• CPU°¡ ÀдÂ(Read) ¼Óµµ´Â ¸Å¿ì ´À¸®°í ¾²´Â °ÍÀº ºü¸£´Ù.
• 3D Ä«µå¿¡¼ ½Ã½ºÅÛ ¸Þ¸ð¸®¸¦ Àд °ÍÀº ¸Å¿ì ´À¸®°í AGP ¸Þ¸ð¸®¸¦ Àд °ÍÀÌ ÈξÀ ºü¸£´Ù.
• »ç½Ç»ó ¹°¸®Àû(Physical) ¸Þ¸ð¸®¿¡ ÀâÈù´Ù. ¹°¸®Àû ¸Þ¸ð¸®¿¡ ÀâÈù´Ù´Â °ÍÀº ¼Óµµ»ó ¸¹Àº À̵æÀÌ ÀÖ´Ù.
• AGP ¸Þ¸ð¸®´Â OS°¡ °ü¸®ÇØ Áֱ⠶§¹®¿¡ ¸¹Àº ¾çÀÇ ¸Þ¸ð¸®¸¦ »ç¿ëÇÏ´õ¶óµµ ±× ÀÌ»óÀÇ ¸Þ¸ð¸®¸¦ ¼ö¿ëÇÒ ¼ö°¡ ÀÖ´Ù. ´Ù¸¸ ¿ë·®ÀÇ ÇÑ°è¿¡ µµ´ÞÇßÀ» ¶§ ½Ã½ºÅÛ ¸Þ¸ð¸®¿Í AGP ¸Þ¸ð¸®°£ÀÇ Àü¼ÛÀÌ ÀϾ ȸéÀÇ ²÷±è Çö»óÀÌ »ý±â°Ô µÈ´Ù.
ÀÌ¿Í °°Àº Ư¼ºÀ¸·Î ÀÎÇØ Ãæµ¹°Ë»ç¸¦ ÇÑ´Ù°í ¹öÅؽº ¹öÆÛ¿¡ ¶ô(Lock)À» °É¾î¼ Àд´ٰųª ÇÏ´Â °æ¿ì°¡ ¾ø¾î¾ß ÇÒ °ÍÀÌ´Ù(¹öÅؽº Á¤º¸¸¦ ½Ã½ºÅÛ ¸Þ¸ð¸®¿¡ °°ÀÌ °¡Áö°í Àֵ簡 ÇØ¾ß µÈ´Ù).
2. ºñµð¿À ¸Þ¸ð¸® = AGP ¸Þ¸ð¸® + 3D Ä«µå ¸Þ¸ð¸®(¿¹Àü¿¡ ÅؽºÃ³ ¸Þ¸ð¸®¶ó ºÒ¸²)
2-1. ¿©±â¼ 3D Ä«µå ¸Þ¸ð¸®´Â ÀϹÝÀûÀ¸·Î 3D Ä«µå ½ºÆå Áß 128MB ¶Ç´Â 64MB¶ó°í À̾߱âÇÏ´Â ¿ë·®À» ¸»ÇÑ´Ù. ºñµð¿À ¸Þ¸ð¸®¿¡´Â ÅؽºÃ³, Z-¹öÆÛ, ¼Îµµ¿ì ¹öÆÛ, ÇÁ·¹ÀÓ ¹öÆÛ, ¹öÅؽº ¹öÆÛ, ½ºÅÙ½Ç ¹öÆÛ µî ¸ðµç 3D Ä«µå°¡ ó¸®ÇÏ´Â °ÍµéÀÌ ¿Ã¶ó°¡°Ô µÈ´Ù.
2-2. °á±¹ Áß¿äÇÑ °ÍÀº AGP ¸Þ¸ð¸®³ª 3D Ä«µåÀÇ ¸Þ¸ð¸®³ª ºñµð¿À ¸Þ¸ð¸®¶ó°í Çصµ 3D Çϵå¿þ¾î¿¡¼´Â °°ÀÌ Ã³¸®µÈ´Ù´Â Á¡ÀÌ´Ù.
D3D8 ÀÎÅÍÆäÀ̽º Áß ´ÙÀ½°ú °°Àº API·Î ÇöÀç »ç¿ëÇÒ ¼ö ÀÖ´Â ºñµð¿À ¸Þ¸ð¸® ¾çÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.
pd3dDevice->
GetAvailableTextureMem();
ÀÌ¿Í °°Àº API·Î ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸®¼Ò½º¸¦ ÀûÀýÇÏ°Ô ºñµð¿À ¸Þ¸ð¸®¿¡ ¿Ã¸± ¼ö ÀÖ´Â µðÅØÆ®(Detect) ±â´ÉÀ» ³Ö¾îÁÖ¸é ÁÁ´Ù.
3.2 ºñµð¿À ¸Þ¸ð¸® ÀÜ·®À» ½Ç½Ã°£À¸·Î ÃøÁ¤(GPGstudy¿¡ ¿Ã·ÁÁø ±Û Á¤¸®) #
#.
UINT IDirect3DDevice9::GetAvailableTextureMem(VOID);
-. Return Values ; »ç¿ë °¡´ÉÇÑ ÅؽºÃ³ ¸Þ¸ð¸®¾çÀÇ ÃßÁ¤°ªÀ» µ¹·ÁÁØ´Ù.
-. ÁÖÀÇ ;
µ¹·Á¹Þ´Â °ªÀº, °¡Àå °¡±î¿î MB °ªÀ¸·Î, ƯÁ¤ÀÇ ¸®¼Ò½º¿¡ ÀÇÇÑ ºñµð¿À ¸Þ¸ð¸®ÀÇ ¼Òºñ¿¡ ¿µÇâÀ» ÁÖ´Â alignment³ª ´Ù¸¥ ¹®Á¦¿¡ ÀÇÇØ, ºñµð¿À ¸Þ¸ð¸®ÀÇ ÃßÁ¤°ªÀ» Á¤È®ÇÏ°Ô ¿ä±¸ÇÒ ¼ö°¡ ¾ø±â ¶§¹®ÀÌ´Ù. ¾ÖÇø®ÄÉÀ̼ǿ¡¼´Â, ÀÌ °ªÀ» »ç¿ëÇØ, ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®ÀÇ ´ë·®ÀûÀÎ ¾çÀ» ÃßÁ¤ÇØ, ÇÒ´çÇÏ·Á°í ÇÏ´Â ¹Ó¸ÊÀÇ ·¹º§¼ö¿Í °°Àº ¸®¼Ò½º¿¡ °üÇÑ °Å½ÃÀûÀÎ °áÁ¤À» ³»¸± ¼ö ÀÖÁö¸¸, ´Ù¸¥ ¸®¼Ò½º¸¦ ÇÒ´çÇϴµ¥ ÃæºÐÇÑ ¸Þ¸ð¸®°¡ ³²¾Æ ÀÖ´ÂÁö µî ÀÛÀº ½ºÄÉÀÏÀÇ °áÁ¤¿¡´Â »ç¿ëÇÒ ¼ö ¾ø´Ù.
-. ÇÊ¿ä ; Header: Declared in
D3D9.h.(Ãâó; MSDN)
(·ç±¤)
Windows °ÔÀÓÀº ¹Ýµå½Ã VRAMÀÇ Å©±â¸¦ ÃßÁ¤ÇØ¾ß ÇÑ´Ù.
DirectX 4¿¡¼
DirectX 7±îÁö´Â
IDirectDrawÀÇ
GetAvailableVidMemÀ» ÅëÇؼ VRAM Å©±â¸¦ Á÷Á¢ ¾òÀ» ¼ö ÀÖ¾ú´Ù.
...(Áß·«)....
DirectX 9¿¡¼´Â ÀÌ ÇÔ¼ö°¡ »ç¶óÁ³´Ù.
DirectX 9 µµ¿ò¸» »ó¿¡´Â »ç¿ëÇÒ ¼ö ÀÖ´Â ºñµð¿À RAMÀÇ ¾çÀ» ±¸ÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀÌ
IDirect3DDevice9 ÀÎÅÍÆäÀ̽ºÀÇ
GetAvailableTextureMemÀ» »ç¿ëÇÏ´Â °ÍÀ̶ó°í ³ª¿Í ÀÖ´Ù.
...(Áß·«)....
±×·¯³ª µµ¿ò¸»À» ÀÚ¼¼È÷ º¸¸é, »ç½Ç ÇÔ¼ö À̸§¿¡¼µµ ÁüÀÛÇÒ ¼ö ÀÖÁö¸¸, ÀÌ ÇÔ¼ö´Â »ç¿ë °¡´ÉÇÑ ÅؽºÃ³ ¸Þ¸ð¸®ÀÇ ¿ë·®À» µ¹·ÁÁÙ »ÓÀε¥, ±× °ªÀº VRAMÀÇ ¿ë·®°ú ´Ù¸£´Ù. ±×·¡¼ ³ª´Â
DX9 °ÔÀÓÀÌ¶óµµ ÀÌ ºÎºÐ¸¸ÅÀº
DX7 API¸¦ »ç¿ëÇÑ´Ù.
DX9¿ë °ÔÀÓ¿¡¼µµ ²À ÇÊ¿äÇÏ´Ù¸é
DX7,
DX6 µîÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡Àº ÀÌ¹Ì À̾߱âÇß¾ú´Ù.
´õ ÀÚ¼¼È÷´Â ¾È ³ª¿Í ÀÖÁö¸¸ ±× µÚ ¹®Àåµé·Î À¯ÃßÇغ¸¸é
QueryInterface¸¦ ÀÌ¿ëÇؼ
DX7
IDirectDraw ÀÎÅÍÆäÀ̽º¸¦ ¾ò¾î¼ ¾î¶»°Ô ÇÒ ¼ö ÀÖ³ª º¾´Ï´Ù...
´ëÃæ ÀÌ·¸³×¿ä..
ÄÚµå:
#include <ddraw.h>
...
m_
MaxAllocMem = m_pDevice->
GetAvailableTextureMem();
/////
LPDIRECTDRAW7 lpDD = NULL;
DDSCAPS2 ddsCaps2;
DWORD dwTotal;
DWORD dwFree;
HRESULT hr;
hr =
DirectDrawCreateEx(NULL, (VOID**)&lpDD, IID_
IDirectDraw7, NULL );
if (FAILED(hr))
return FALSE;
// Initialize the structure.
ZeroMemory(&ddsCaps2, sizeof(ddsCaps2));
ddsCaps2.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
hr = lpDD->
GetAvailableVidMem(&ddsCaps2, &dwTotal, &dwFree);
if (FAILED(hr))
return FALSE;
if(lpDD)
lpDD->Release();
Âü°í·Î ÀÌ°Ç ½Ã½ºÅÛ ¸Þ¸ð¸®¿¡ °üÇÑ°Å..
ÄÚµå:
MEMORYSTATUS
MemStatus;
MemStatus.dwLength=sizeof(
MemStatus);
GlobalMemoryStatus(&
MemStatus);
// get video memory
long nStartVideoMemory = g_pDirect3
DDevice->
GetAvailableTextureMem();
if( nStartVideoMemory <= 50000000 ) // tiny Video Memory => 16(Video) + 32(AGP)
g_byVideoMemoryType = eVIDEOMEM_TINY;
else
if( nStartVideoMemory <= 97000000 ) // Small Video Memory => 32(Video) + 64(AGP)
g_byVideoMemoryType = eVIDEOMEM_SMALL;
3.3 Windows ÀÛ¾÷ °ü¸®ÀÚ #
#.ÀÛ¾÷°ü¸®ÀÚ¿¡¼ ÁÖÀ§ ±í°Ô ºÁ¾ßÇÒ Ç׸ñ Áß¿¡ ¸Þ¸ð¸® »ç¿ë°ú VMÅ©±â¶ó´Â °ÍÀÌ ÀÖ´Ù.
¸Þ¸ð¸® »ç¿ë·®Àº ÇØ´ç ÇÁ·Î¼¼½º°¡ ÇöÀç »ç¿ëÁßÀÎ ¹°¸®Àû ¸Þ¸ð¸®ÀÇ ¾çÀÌ´Ù.
VM Å©±â´Â ÇØ´ç ÇÁ·Î¼¼½º¿¡ ÇÒ´çµÈ ÃÑ °¡»ó ¸Þ¸ð¸®ÀÌ´Ù.
4 D3DX ÇÔ¼ö #
4.1 ȸé Å©±â ±¸ÇÏ´Â ¹ý #
1.
GetDesktopWindow(),
GetWindowRect()
- Desktopµµ ÇϳªÀÇ À©µµ¿ìÀ̹ǷÎ, DesktopÀÇ À©µµ¿ì ÇÚµéÀ» ¾ò¾î âũ±â¸¦ ±¸ÇÏ´Â ¹æ½Ä
CRect rcDesktop;
::
GetWindowRect(
GetDesktopWindow()->m_hWnd, &rcDesktop);
int width = rcDesktop.right - rcDesktop.left;
int height = rcDesktop.bottom - rcDesktop.top;
2.
GetSystemMetrics()
- ±ò²ûÇÏ°í °£´ÜÇÔ
int width =
GetSystemMetrics(SM_CXSCREEN);
int height =
GetSystemMetrics(SM_CYSCREEN);
3.
GetDeviceCaps()
- HDC¸¦ ¾î¶»°Ô ±¸ÇϳĿ¡ µû¶ó¼ µà¾ó ¸ð´ÏÅÍ »ç¿ë½Ã °¢°¢ÀÇ ¸ð´ÏÅÍ¿¡¼ Çػ󵵸¦ ±¸ÇØ¿Ã ¼ö ÀÖ´Ù´Â°Ô ÀåÁ¡
HDC hDC =
GetDC();
int width =
GetDeviceCaps(hDC, HORZRES);
int height =
GetDeviceCaps(hDC, VERTRES);
cf.
GetDesktopWindow(); | µ¥½ºÅ©Åé À©µµ¿ì(·çÆ® À©µµ¿ì) ÇÚµéÀ» ¹Ýȯ |
GetActiveWindow(); | ÇöÀç È°¼ºÈ µÈ À©µµ¿ìÀÇ ÇÚµéÀ» ¹Ýȯ (â¸ðµå) |
GetForegroundWindow(); | È°¼ºÈ ¿©ºÎ¿Í °ü°è¾øÀÌ ÃÖ»óÀ§ À§µµ¿ì ÇÚµéÀ» ¹Ýȯ |
4.1.1 ½Ã½ºÅÛ Á¤º¸¸¦ Ãâ·ÂÇÏ´Â ¹æ¹ý ; µà¾ó¸ð´ÏÅÍÀÇ ¸ð´ÏÅÍ »çÀÌÁî #
££.
GetSystemMetrics function
Âü°íÇÔ¼ö
SystemParametersInfo
-.
Syntax
int WINAPI
GetSystemMetrics(
_In_ int nIndex
);
nIndex : Á¶»çÇÏ°íÀÚ ÇÏ´Â ¼³Á¤ Á¤º¸. º¸Åë SM_CX, SM_CY·Î ½ÃÀÛÇϴµ¥ °¢°¢ XÃà ¼³Á¤°ª°ú YÃà ¼³Á¤°ªÀ¸·Î ±¸¼º
-.
Parameters
SM_CLEANBOOT - ½Ã½ºÅÛÀÌ ¾î¶»°Ô ºÎÆõǾú´ÂÁö¸¦ Á¶»ç
0ÀÌ¸é º¸Åë ¸ðµå·Î ºÎÆÃ, 1ÀÌ¸é ¼¼ÀÌÇÁ ¸ðµå·Î ºÎÆÃ, 2ÀÌ¸é ³×Æ®¿÷ Áö¿øÀÌ ÀÖ´Â ¼¼ÀÌÇÁ ¸ðµå·Î ºÎÆÃ
SM_CMONITORS - 98, 2000 ÀÌ»ó : µ¥½ºÅ©Å¾ÀÇ ¸ð´ÏÅÍ °³¼ö
SM_CMOUSEBUTTONS - ¸¶¿ì½ºÀÇ ¹öÆ° °³¼ö.
0ÀÌ¸é ¸¶¿ì½º°¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾ÊÀ½
SM_CXSCREEN, SM_CYSCREEN - ÇÁ¶óÀ̸Ӹ® µð½ºÇ÷¹ÀÌÀÇ È¸é Å©±â
ÀÌ °ªÀº µ¥½ºÅ©Å¾ DC·Î
GetDeviceCaps ÇÔ¼ö¸¦ È£ÃâÇÏ¿© HORZRES, VERTRES¸¦ È£ÃâÇÑ °á°ú¿Í µ¿ÀÏ
...
SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN - 98/ME, 2000ÀÌ»ó : °¡»ó ½ºÅ©¸°ÀÇ Æø°ú ³ôÀÌ
ÀÌ Å©±â´Â ¸ðµç µð½ºÇ÷¹ÀÌ ¸ð´ÏÅÍ ¿µ¿ªÀ» µÑ·¯½Î´Â Å©±â
SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN - 98/MEÀÌ»ó, 2000ÀÌ»ó : °¡»ó ½ºÅ©¸°ÀÇ ¿ÞÂÊ À§ÀÇ ÁÂÇ¥
-.
Return value
GetSystemMetrics( SM_ARRANGE );ÀÇ ¸®ÅÏ °ª
; ÃÖ¼ÒÈµÈ À©µµ¿ì¸¦ ¾î¶² ½ÄÀ¸·Î Á¤·ÄÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÑ´Ù. Á¤·Ä ½ÃÀÛ À§Ä¡¿Í ¹æÇâÀ» ¸®ÅÏÇϴµ¥ ½ÃÀÛ À§Ä¡´Â ´ÙÀ½ Áß Çϳª
Value (½ÃÀÛ À§Ä¡) | Meaning |
ARW_BOTTOMLEFT | Start at the lower-left corner of the screen. The default position. |
ARW_BOTTOMRIGHT | Start at the lower-right corner of the screen. Equivalent to ARW_STARTRIGHT. |
ARW_TOPLEFT | Start at the upper-left corner of the screen. Equivalent to ARW_STARTTOP. |
ARW_TOPRIGHT | Start at the upper-right corner of the screen. Equivalent to ARW_STARTTOP | SRW_STARTRIGHT. |
/ Á¤·Ä ¹æÇâ ARW_DOWN, ARW_LEFT, ARW_RIGHT, ARW_UP Áß Çϳª°¡ µÈ´Ù.
GetSystemMetrics( SM_DIGITIZER );ÀÇ ¸®ÅÏ °ª - Windows 7 or Windows Server 2008 R2 ÀÌÈÄ ¹öÀü¿¡¼ Áö¿ø
NID_INTEGRATED_TOUCH, NID_EXTERNAL_TOUCH, NID_INTEGRATED_PEN, NID_EXTERNAL_PEN, NID_MULTI_INPUT, NID_READY
-. ½Ì±Û ¸ð´ÏÅÍÀÇ °æ¿ì
left = 0;
top = 0;
right =
GetSystemMetrics( SM_CXSCREEN );
bottom =
GetSystemMetrics( SM_CYSCREEN );
-. µà¾ó¸ð´ÏÅÍÀÇ °æ¿ì °¢°¢ÀÇ ¸ð´ÏÅÍ ÁÂÇ¥°¡ ¾Æ´Ñ Àüü µÎ°³ ÀÌ»óÀÇ ¸ð´ÏÅ͸¦ ÇÕÄ£ Àüü ¸ð´ÏÅÍ »çÀÌÁî
left =
GetSystemMetrics( SM_XVIRTUALSCREEN );
top =
GetSystemMetrics( SM_YVIRTUALSCREEN );
right =
GetSystemMetrics( SM_CXVIRTUALSCREEN );
bottom =
GetSystemMetrics( SM_CYVIRTUALSCREEN );
¸ð´ÏÅÍÀÇ ¹èÄ¡¿Í ±âº» À§Ä¡¿¡ µû¶ó left, topÀÌ À½¼ö °ªÀÌ µÉ ¼ö Àֱ⠶§¹®¿¡ ÁÖÀÇ
4.2 D3DX ±âÇϹ°Ã¼ #
*
D3DX ¶óÀ̺귯¸®´Â ´ÙÀ½ÀÇ 6°¡Áö ¸Þ½¬ »ý¼º ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
D3DXCreatBox/ Sphere/ Cylinder/ Teapot/ Polygon/ Torus
* <¼±¾ð> --> <·»´õ¸µ>; ÇÊ¿ä¾øÀ» ¶§´Â ¸®¼Ò½º¸¦ ÇØÁ¦ÇÑ´Ù.
* »ç¿ë¿¹
LPD3DXMESH g_sphere = NULL;
// »ý¼º
D3DXCreateSphere(g_pd3dDevice, 1.f, 3, 3, &g_sphere, NULL );
D3DXComputeNormals( g_sphere, NULL );
// º¯È¯
D3DXMatrixTranslation(&testMat->g_matWorld, x, y, z);
// ¿ùµå¸ÅÆ®¸¯½º Àû¿ë
g_pd3dDevice->
SetTransform( D3DTS_WORLD, &testMat->g_matWorld );
g_sphere->
DrawSubset(0); // ·»´õ¸µ
// ¼Ò°Å
if( g_sphere != NULL ) g_sphere->Release();
g_sphere = 0;
HEL(Hardware Emulation Layer, RGB ÀåÄ¡¶ó°íµµ ÇÔ) ; ¼ÒÇÁÆ®¿þ¾îÀûÀ¸·Î ƯÁ¤ÇÑ ±â´ÉÀ» ¿¡¹Ä·¹À̼Ç
-.
DirectX 8.0 ÀÌÈÄ·Î Á¦°øµÇÁö ¾ÊÀ½
Ç÷¯±×ºí ¼ÒÇÁÆ®¿þ¾î(pluggable software device) ;
DirectX 9¿¡¼ ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ°¡ ÀÛ¼ºÇÑ
HELÀ» »ç¿ëÇϱâ À§ÇÑ ÀÎÅÍÆäÀ̽º
Win32 ¾îÇø®ÄÉÀÌ¼Ç ¡ê
Direct3D API ¡ê HAL µð¹ÙÀ̽º ¡êµð¹ÙÀ̽º µå¶óÀ̹ö ÀÎÅÍÆäÀ̽º(DDI)¡ê±×·¡ÇÈÇϵå¿þ¾î
Win32 ¾îÇø®ÄÉÀÌ¼Ç ¡ê GDI ¡êµð¹ÙÀ̽º µå¶óÀ̹ö ÀÎÅÍÆäÀ̽º(DDI)¡ê±×·¡ÇÈÇϵå¿þ¾î
À§¿¡¼ º¸´Â °Íó·³,
Direct3D´Â DDI(Device Driver Interface)¸¦ ÅëÇÏ¿© ±×·¡ÇÈ Çϵå¿þ¾î¿¡ Á¢±ÙÇÏ´Â
¼ö´ÜÀ¸·Î HALÀ» »ç¿ëÇÑ´Ù.
HAL(Hardware Abstraction Layer); ÁÖ µð¹ÙÀ̽º ŸÀÔÀÌ°í Çϵå¿þ¾î °¡¼Ó ·¡½ºÅÍÈ ¹× Çϵå¿þ¾î¿Í ¼ÒÇÁÆ®¿þ¾î
¹öÅؽº ÇÁ·Î¼¼½Ì µÎ °¡Áö ¸ðµÎ¸¦ Áö¿øÇÑ´Ù.
µð½ºÇ÷¹ÀÌ ¾î´ðÅÍ°¡
Direct3D¸¦ Áö¿øÇÑ´Ù¸é, HALÀÌ ÄÄÇ»ÅÍ¿¡ Á¸ÀçÇÑ´Ù.
DirectX 9.0 ¾îÇø®ÄÉÀ̼ÇÀº ±×·¡ÇÈ Ä«µå µå¶óÀ̹ö°¡
DirectX 7 DDI ÀÌ»óÀ» Áö¿øÇØ¾ß ½ÇÇàÇÑ´Ù.
¿ÏÀüÈ÷ ¼ÒÇÁÆ®¿þ¾îÀûÀ¸·Î ¶Ç´Â ºÎºÐÀûÀ¸·Î ¹öÅؽº ÇÁ·Î¼¼½ÌÀ» ¿¡¹Ä·¹ÀÌ¼Ç ÇÒ ¼ö ÀÖ´Ù.
-. D3DCREATE_SOFTWARE_VERTEXPROCESSING
-. D3DCREATE_HARDWARE_VERTEXPROCESSING
-. D3DCREATE_MIXED_VERTEXPROCESSING
_. D3DCREATE_PUREDEVICE ;
Direct3D°¡ »óÅ ºí·Ï¿¡ ÀúÀåµÉ ¼ö ÀÖ´Â Get~ ÇüÅÂÀÇ ¾î¶°ÇÑ È£Ãâµµ
Áö¿øÇÏÁö ¾ÊÀ½À» ¼³Á¤ÇÏ°íÀÚ ÇÒ ¶§ »ç¿ë
·¹ÆÛ·±½º ·¡½ºÅͶóÀÌÀú´Â
Direct3D 9.0 Àüü ±â´ÉÀ» Áö¿øÇÏ´Â ¹Ý¸é¿¡, Ç÷¯±×ºí ¼ÒÇÁÆ®¿þ¾î ÀåÄ¡´Â ½ÉÁö¾î
Å×½ºÃ³¸µµµ Áö¿øÇÏÁö ¾Ê´Â´Ù.
»ç¿ëÇÏ´Â ÄÄÇ»ÅÍ¿¡ Çϵå¿þ¾î °¡¼Ó ±â´ÉÀÌ ¾ø´Ù¸é HAL ÀåÄ¡ »ý¼º ½Ãµµ´Â ½ÇÆÐÇÏ°Ô µÈ´Ù.
IDirect3D9::
RegisterSoftwareDevice; Ç÷¯±×ºí ¼ÒÇÁÆ®¿þ¾î ÀåÄ¡¸¦ µî·ÏÇϱâ À§ÇÑ ÇÔ¼ö
¼ÒÇÁÆ®¿þ¾î ÀåÄ¡µéÀº ¾îÇø®ÄÉÀ̼ǿ¡ ÀÇÇØ ·ÎµåµÇ¾î
IDirect3D9 °´Ã¼¸¦ »ç¿ëÇÏ¿© µî·Ï
DirectX 9 DDK(Device Driver Kit)¿¡ ´õ ÀÚ¼¼ÇÑ Á¤º¸°¡ ÀÖÀ½
·¹ÆÛ·±½º ·¡½ºÅͶóÀÌÀú
·¹ÆÛ·±½º ÀåÄ¡´Â SDKÀÇ ¼³Ä¡ ½Ã¿¡¸¸ Á¦°øÇϸç,
Direct3DÀÇ ¸ðµç ±â´ÉµéÀ» Áö¿ø
±×·¡ÇÈ Ä«µå°¡ Áö¿øÇÏÁö ¾Ê´Â ±â´ÉµéÀ¸¸® Å×½ºÆ®Çϱâ À§Çؼ¸¸ ·¹ÆÛ·±½º ·¡½ºÅͶóÀÌÀú¸¦ »ç¿ëÇØ¾ß Çϸç,
ÀÌ ÀåÄ¡´Â ¼Óµµ¸¦ À§Çؼ°¡ ¾Æ´Ï¶ó, Á¤¹Ðµµ¸¦ À§ÇØ ÃÖÀûÈ
Direct3D´Â ±âº»ÀûÀ¸·Î ·¹ÆÛ·±½º ·¡½ºÅͶóÀÌÀú¸¦ ¿¡¹Ä·¹À̼ÇÇÏÁö ¾Ê´Â´Ù.
COM(Component Object Model) ÄÄÆ÷³ÍÆ®´Â ÀÏ°üµÇ°í Á¤ÀÇµÈ ¹æ¹ýÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â ÀϹÝÀûÀÎ
.DLL(Dynamic Link Library) ÆÄÀϷνá, COM ÀÎÅÍÆäÀ̽ºµéÀº °áÄÚ º¯°æÇÒ ¼ö ¾øÀ¸¸ç ¾ð¾î¿¡ µ¶¸³ÀûÀ¸·Î
COM ÄÄÆ÷³ÍÆ®ÀÇ ÇÔ¼ö¿¡¸¸ ¾×¼¼½ºÇÒ ¼ö ÀÖ½À´Ï´Ù.
v-table; COM °´Ã¼¿¡¼ ±¸ÇöµÈ ÇÔ¼öµéÀ» ÂüÁ¶ÇÏ´Â °¡»ó ÇÔ¼ö Å×À̺í·Î, COM ÇÔ¼öµéÀº Á÷Á¢ÀûÀ¸·Î Á¢±Ù¸øÇÔ
4.3 HRESULT D3DXSaveSurfaceToFile( ..., D3DXIMAGE_FILEFORMAT, ... ); #
Saves a surface to a file.
¢¹
Syntax
HRESULT
D3DXSaveSurfaceToFile(
_In_ LPCTSTR pDestFile,
_In_ D3DXIMAGE_FILEFORMAT
DestFormat,
_In_
LPDIRECT3DSURFACE9 pSrcSurface,
_In_ const PALETTEENTRY *pSrcPalette,
_In_ const RECT *pSrcRect
);
//¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ
££. D3DXIMAGE_FILEFORMAT enumeration
Describes the supported image file formats. See Remarks for descriptions of these formats.
¢¹
Syntax
typedef enum D3DXIMAGE_FILEFORMAT {
D3DXIFF_BMP = 0,
D3DXIFF_JPG = 1,
D3DXIFF_TGA = 2,
D3DXIFF_PNG = 3,
D3DXIFF_DDS = 4,
D3DXIFF_PPM = 5,
D3DXIFF_DIB = 6,
D3DXIFF_HDR = 7,
D3DXIFF_PFM = 8,
D3DXIFF_FORCE_DWORD = 0x7fffffff
} D3DXIMAGE_FILEFORMAT, *LPD3DXIMAGE_FILEFORMAT;
//¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ
££. PALETTEENTRY structure
Specifies the color and usage of an entry in a logical palette.
¢¹
Syntax
typedef struct PALETTEENTRY {
BYTE peRed;
BYTE peGreen;
BYTE peBlue;
BYTE peFlags;
} PALETTEENTRY, *LPPALETTEENTRY;
/ BYTE peFlags; - The alpha intensity value for the palette entry. Note that as of
DirectX 8, this member is treated differently than documented for Windows.
//¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë¡ë
// DEFINES
//¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ
#define SCREENSHOT_FORMAT D3DXIFF_BMP
#define SCREENSHOT_COMPRESSED_FORMAT D3DXIFF_JPG
#define SCREENSHOT_EXTENSION "bmp"
#define SCREENSHOT_COMPRESSED_EXTENSION "jpg"
#define SCREENSHOT_PREFIX "Hellgate_"
#define SCREENSHOT_PATH "Screenshots\\"
#define SCREENSHOT_MIN_TIME_BETWEEN 0.1f
//¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ
static HRESULT sCaptureScreenshot( ScreenShotInfo * pInfo )
{
SPDIRECT3DSURFACE9 pBuffer;
...
D3DC_IMAGE_FILE_FORMAT tFormat = pInfo->bCompressed ? SCREENSHOT_COMPRESSED_FORMAT : SCREENSHOT_FORMAT;
RECT * pRect = NULL;
D3DPRESENT_PARAMETERS tPP = dxC_GetD3DPP();
WINDOWINFO tInfo;
if ( tPP.Windowed )
{
GetWindowInfo( tPP.hDeviceWindow, &tInfo );
pRect = & tInfo.rcClient;
}
V_RETURN( OS_PATH_FUNC(D3DXSaveSurfaceToFile)( szFilePath, tFormat, pBuffer, NULL, pRect ) );
...
return S_OK;
}
//¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ¤Ñ
4.4 D3DXCheckVersion - D3D ¹öÀü È®ÀÎÇϱâ #
D3D´Â °°Àº ¹öÀü´ë¶óµµ ºÐ±âº° ¾÷µ¥ÀÌÆ®·Î ÀÎÇØ ³»ºÎ ÇÔ¼ö°¡ º¯°æµÇ°Å³ª ÀÎÀÚ°¡ º¯°æµÇ´Â °æ¿ì°¡ ÀÖ¾î¼ º¸Åë ÇϳªÀÇ ¹öÀüÀ» °íÁ¤½ÃÄÑµÎ°í »ç¿ëÇϴµ¥, À̶§ ÇÁ·ÎÁ§Æ®¿¡¼ ¹öÀü üũ¸¦ À§ÇØ »ç¿ëÇÏ´Â ÇÔ¼ö.
#include <d3dx9.h>
#include <cstdio>
#pragma comment( lib, "d3dx9.lib" )
void main() {
#if (D3DX_SDK_VERSION != 42)
#error ÀÌ ÇÁ·ÎÁ§Æ®¿¡¼ »ç¿ëµÈ ¹öÀü°ú ´Ù¸¥ Direct3D ¹öÀüÀ» »ç¿ëÇÏ°í °è½Ê´Ï´Ù.
#endif
if (!D3DXCheckVersion(D3D_SDK_VERSION, /*D3DX_SDK_VERSION*/ 41)) {
printf("¹öÀüÀÌ ´Þ¶ó¿ä~ Çغ¸¸®\n");
}
}
4.5 OSVERSIONINFOEX Structure (Windows)¸¦ ÀÌ¿ëÇÑ ¹öÀü È®ÀÎ #
#. ¹öÀü Á¤º¸ ¾ò±â
OSVERSIONINFOEX version;
memset(&version, 0, sizeof(version));
version.dwO
SVersionInfoSize = sizeof(version);
if(
GetVersionEx((OSVERSIONINFO*)&version))
{
printf("Windows %d.%d.%d", version.dwMajorVersion, version.dwMinorVersion, version.dwBuildNumber);
}
#.
DirectX ÀÎÅÍÆäÀ̽º »ý¼º
IDirect3D9* d3d =
Direct3DCreate9(D3D_SDK_VERSION)
#. ¿øÇÏ´Â
DirectX
LoadLibrary ¿©ºÎ È®ÀÎ
string d3dx9_dll = format("d3dx9_%d.dll", D3DX_SDK_VERSION);
if(HINSTANCE hDll =
LoadLibrary(d3dx9_dll.c_str()))
{
}
else
{
printf("Cannot find %s\n", d3dx9_dll.c_str());
}
Âü°í ÄÚµå(GSUtil.cpp)
4.6 Rendering °ü·Ã ¼³Á¤, Log ÆÄÀÏ·Î ÀúÀå #
///////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// m_pd3dDevice->
SetRenderState(...),
SetSamplerState(...),
SetTextureStageState(...); ¼³Á¤À»
// Log·Î Ãâ·ÂÇϱâ À§ÇØ ¸ÊÇÎ Çü½ÄÀ¸·Î »ç¿ëÇÑ ¿¹
#define MAX_RENDER_STATE_NUM 256
#define MAX_TEXTURE_STAGE_NUM 8
#define MAX_TEXTURE_STAGESTATE_NUM 29
#define MAX_SAMPLER_STAGE_NUM 8
#define MAX_SAMPLER_STATE_NUM 14
//=============================================================================
//-----------------------------------------------------------------------------
class
RenderDevice : public
D3DDevice
{
public:
...
void
SetTextureStageState(DWORD dwStage,
D3DTEXTURESTAGESTATETYPE type, DWORD Value);
void
SetTexture(DWORD Stage,
IDirect3DBaseTexture9* pTexture );
void
SetSamplerState(DWORD Sampler,
D3DSAMPLERSTATETYPE Type, DWORD Value);
void
LogRenderState();
void
LogSamplerState();
void
LogTextureStageState();
public:
LPDIRECT3DDEVICE9 m_pd3dDevice; // The
D3D rendering device
DWORD m_dwRenderStateList
MAX_RENDER_STATE_NUM; // Log¸¦ Ãâ·ÂÇϱâ À§ÇØ ¸ÊÇÎ Çü½ÄÀ¸·Î »ç¿ë
DWORD m_dwTextureStageStateList
MAX_TEXTURE_STAGE_NUM
MAX_TEXTURE_STAGESTATE_NUM;
DWORD m_dwSamplerStateList
MAX_SAMPLER_STAGE_NUM
MAX_SAMPLER_STATE_NUM;
...
};
//=============================================================================
//-----------------------------------------------------------------------------
void RenderDevice:
:SetRenderState(
D3DRENDERSTATETYPE State, DWORD Value)
{
if(State<0 || State>=MAX_RENDER_STATE_NUM) return;
if(m_dwRenderStateList
State != Value){
m_dwRenderStateList
State = Value;
m_pd3dDevice->
SetRenderState( State, Value );
}
}
void RenderDevice:
:SetSamplerState(DWORD dwStage,
D3DSAMPLERSTATETYPE State, DWORD Value)
{
if(dwStage<0 || dwStage>=MAX_SAMPLER_STAGE_NUM) return;
if(State<0 || State>=MAX_SAMPLER_STATE_NUM ) return;
if(m_dwSamplerStateList
dwStage
State != Value){
m_dwSamplerStateList
dwStage
State = Value;
m_pd3dDevice->
SetSamplerState( dwStage, State, Value );
}
}
void RenderDevice:
:SetTextureStageState(DWORD dwStage,
D3DTEXTURESTAGESTATETYPE type, DWORD Value)
{
if(dwStage<0 || dwStage>=MAX_TEXTURE_STAGE_NUM) return;
if(type<0 || type>=MAX_TEXTURE_STAGESTATE_NUM ) return;
if(m_dwTextureStageStateList
dwStage
type != Value){
m_dwTextureStageStateList
dwStage
type = Value;
m_pd3dDevice->
SetTextureStageState(dwStage, type, Value);
}
}
//-----------------------------------------------------------------------------
void RenderDevice:
:LogRenderState()
{
FILE* fp = fopen("
RenderStateLog.txt", "wt");
if(fp==NULL) return;
for(int i=0;i<MAX_RENDER_STATE_NUM;i++){
fprintf(fp, "Index:%d Val=%d\n", i, m_dwRenderStateList[i]);
}
fclose(fp);
}
void RenderDevice:
:LogSamplerState()
{
FILE* fp = fopen("
SamplerStateLog.txt", "wt");
if(fp==NULL) return;
for(int i=0;i<MAX_SAMPLER_STAGE_NUM;i++){
for(int j=0;j<MAX_SAMPLER_STATE_NUM;j++){
fprintf(fp, "Stage:%d State:%d Val=%d\n", i,j, m_dwSamplerStateList[i][j]);
}
}
fclose(fp);
}
void RenderDevice:
:LogTextureStageState()
{
FILE* fp = fopen("
TextureStageStateLog.txt", "wt");
if(fp==NULL) return;
for(int i=0;i<MAX_TEXTURE_STAGE_NUM;i++){
for(int j=0;j<MAX_TEXTURE_STAGESTATE_NUM;j++){
fprintf(fp, "Stage:%d State:%d Val=%d\n", i,j, m_dwTextureStageStateList[i][j]);
}
}
fclose(fp);
}
5 Display #
5.1 ¸Ê2ÀåÀ» »ç¿ëÇÑ ¹ý¼± ¸ÊÇÎ #
D3DTEXTUREOP ¿°ÅÇü(½ºÅ×ÀÌÁö¸¶´Ù ÅؽºÃ³ È¥ÇÕ Ã³¸®¸¦ Á¤ÀÇ)
typedef enum _D3DTEXTUREOP {
D3DTOP_DISABLE = 1,
...
D3DTOP_MULTIPLYADD = 25,: ÀûÈ¿¬»êÀ» ½ÇÇàÇÑ´Ù.
¸¶Áö¸· 2 °³ÀÇ Àμö¸¦ ÃëÇØ, À̰͵éÀ» °ö¼ÀÇØ, ³ª¸ÓÁöÀÇ ÀÔ·Â/¼Ò½º Àμö¿¡ µ¡¼À ÇØ, ÀÌ°ÍÀ» °á°ú¿¡ ¹èÄ¡ÇÑ´Ù.
SRGBA= Arg1 + Arg2 * Arg3
...
}
D3DTEXTUREOP;
Âü°í; 3D°ÔÀÓÇÁ·Î±×·¡¹Ö(±è¿ëÁØ Àú) 2ºÎ 5Àå ¹ý¼± ¸ÊÇο¡¼ ÃßÃâ
g_pd3dDevice->SetTexture( 0, g_pTexNormal ); // 0¹ø ÅؽºÃÄ ½ºÅ×ÀÌÁö¿¡ ÅؽºÃÄ °íÁ¤(¹ý¼±¸Ê)
g_pd3dDevice->SetTexture( 1, g_pTexDiffuse ); // 1¹ø ÅؽºÃÄ ½ºÅ×ÀÌÁö¿¡ ÅؽºÃÄ °íÁ¤(º®¸é¸Ê)
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
DWORD dwFactor = VectortoRGBA( &g_vLight, 0.0f ); // º¤Å͸¦ RGB·Î
g_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, dwFactor );
// RGB·Î º¯È¯µÈ º¤Å͸¦ TextureFactor°ªÀ¸·Î µî·Ï
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MULTIPLYADD );
// º®¸é¸Ê ÅؽºÃ³¿Í ¹ý¼±¸ÊÀ» ¼¯¾î¼ Ãâ·Â
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
5.2 ¾ËÆÄºí·»µù #
*
D3DÀÇ ¾ËÆÄºí·»µùÀº ¾Æ·¡¿Í °°ÀÌ ÀÌ·ç¾îÁø´Ù.
WriteColor =
SrcBlend *
SrcColor +
DstBlend *
DstColor ;
WriteColor : ȸ鿡 Âï°íÀÚ ÇÏ´Â »ö»ó
SrcColor : ÅؽºÃÄ ºí·»µù(½¦À̵ù,¸ÖƼÅؽºÃĸµ µûÀ§...)ó¸®µÈ ÅؽºÃÄ»ö»ó
DstColor : ÇöÀç ȸ鿡 ÂïÇôÀÖ´Â »ö»ó
SrcBlend¿Í
DstBlend¸¦ Àû´çÈ÷ Àß ¸¸µé¾î ÁÖ¸é Àç¹ÌÀÖ´Â È¿°ú¸¦ ¾òÀ»¼ö ÀÖ½À´Ï´Ù.
DBLEND ¿°ÅÇü(Áö¿ø µÇ°í ÀÖ´ÂÈ¥ÇÕ ¸ðµå¸¦ Á¤ÀÇ)
typedef enum _D3DBLEND {
D3DBLEND_ZERO = 1,
D3DBLEND_ONE = 2,
D3DBLEND_SRCCOLOR = 3,
D3DBLEND_INVSRCCOLOR = 4,
D3DBLEND_SRCALPHA = 5,
D3DBLEND_INVSRCALPHA = 6,
D3DBLEND_DESTALPHA = 7,
D3DBLEND_INVDESTALPHA = 8,
D3DBLEND_DESTCOLOR = 9,
D3DBLEND_INVDESTCOLOR = 10,
D3DBLEND_SRCALPHASAT = 11,
D3DBLEND_BOTHSRCALPHA = 12,
D3DBLEND_BOTHINVSRCALPHA = 13,
D3DBLEND_BLENDFACTOR = 14,
D3DBLEND_INVBLENDFACTOR = 15,
D3DBLEND_FORCE_DWORD = 0x7fffffff
}
D3DBLEND;
m_pd3dDevice->SetTexture( 0, m_pWaterTex[0] );
m_pd3dDevice->SetTexture( 1, m_pWaterTex[1] );
//¾ËÆÄºí·»µù Åõ¸í(¹ÝÅõ¸í)ÇÏ°Ô ---------------------------------------------
m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR ); // Åõ¸í
// m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVDESTCOLOR); // ¹ÝÅõ¸í
Ãâó : °¨ÀÚ´å³Ý + ±ÔÁø
5.3 Ä¿¼¸¦ ¸¶À½´ë·Î... #
SetCursor( NULL ); // ¸¶¿ì½º¸¦ ³ªÅ¸³ªÁö ¾Ê°Ô ¾Ê´Ù.
HCURSOR hcr;
hcr =
LoadCursor(NULL,IDC_ARROW);
SetCursor( hcr ); // ¸¶¿ì½º¸¦ ³ªÅ¸³ª°ÔÇÔ
ShowCursor(TRUE);
ShowCursor(false);
GetCursorPos(LPPOINT lpPoint);
SetCursorPos(int x, int y);
5.4 D3D 9.0 ±ÛÀÚ¾²±â(±ÔÁø¿¡°Ô °¨»ç) #
LPD3DXFONT m_pStatsFont;
m_pStatsFont = NULL;
// ¼±¾ð
HRESULT hr;
if( FAILED( hr =
D3DXCreateFont( g_pd3dDevice, 30, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial"), &m_pStatsFont ) ) )
{
MessageBox(g_hwnd,"
D3DXCreateFont fail","error",MB_OK);
return 0;
}
// ·»´õ¸µ ½Ã°£Ç¥½Ã ¿¹
fFPS = myTimer.
GetFPS();
sprintf(cFPS,"FPS: %4.1f",fFPS);
/
/TextOut(hDC,0,0,str,(int)strlen(str));
/
/SetWindowText(hWnd,str);
RECT rc;
SetRect( &rc, 5, 5, 0, 0 );
// DT_NOCLIP : Ŭ¸®ÇÎÇÏÁö ¾Ê°í µå·ÎÀ×ÇÑ´Ù.
m_pStatsFont->
DrawText( NULL, cFPS, -1, &rc, DT_NOCLIP,
D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ));
5.5 Depth Buffer ºñ±³ ¿É¼Ç ¹Ù²Ù±â #
·»´õ¸µ surface¿¡¼ depth testingÀÌ ÀϾ ¶§ ¸¸¾à z ȤÀº w°ªÀÌ ÀÌÀüÀÇ °ªº¸´Ù ´õ ÀÛÀº °æ¿ì
Direct3DÀº render Ÿ°ÙÀ» ¾÷µ¥ÀÌÆ® Çϵµ·Ï µÇ¾îÀÖ´Ù.
±×·¯³ª ÇÊ¿äÇÑ °æ¿ì D3DRS_ZFUNCÀÇ °ªÀ» ¼¼ÆÃÇÏ¿© ÀÌ·¯ÇÑ ¿É¼ÇÀ» ¹Ù²Ü¼ö ÀÖ´Ù.
typedef enum_D3DCMPFUNC {
D3DCMP_NEVER = 1,: Ç×»ó fail °ªÀ» ÁØ´Ù.
D3DCMP_LESS = 2,: ÀÌÀü °ªº¸´Ù ÀÛÀ¸¸é acceptÇÑ´Ù
D3DCMP_EQUAL = 3,: ÀÌÀü °ª°ú °°À¸¸é accept ÇÑ´Ù
D3DCMP_LESSEQUAL = 4,: ÀÌÀü °ªº¸´Ù °°°Å³ª ÀÛÀ¸¸é acceptÇÑ´Ù
D3DCMP_GREATER = 5,: ÀÌÀü °ªº¸´Ù Å©¸é acceptÇÑ´Ù.
D3DCMP_NOTEQUAL = 6,: ÀÌÀü °ªº¸´Ù °°Áö ¾ÊÀ¸¸é acceptÇÑ´Ù.
D3DCMP_GREATEREQUAL = 7,: ÀÌÀü °ªº¸´Ù Å©°Å³ª °°À¸¸é acceptÇÑ´Ù
D3DCMP_ALWAYS = 8,:Ç×»ó acceptÇÑ´Ù
D3DCMP_FORCE_DWORD = 0x7fffffff // D3DCMP_FORCE_DWORD °á°ú¸¦ 32bit »çÀÌÁî·Î ¹Ù²Û´Ù. ÀÌ°ªÀº »ç¿ëµÇÁö ¾Ê´Â´Ù.
}
D3DCMPFUNC;
5.6 Quaternion #
* QuaternionȸÀü
D3DXMATRIX *
D3DXMatrixRotationQuaternion(
D3DXMATRIX *pOut, // [in, out] ¿¬»ê °á°úÀÎ
D3DXMATRIX ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
CONST
D3DXQUATERNION *pQ ); //
in ó¸®ÀÇ ±âº»À¸·Î µÇ´Â
D3DXQUATERNION ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
¹Ýȯ°ª; ¼Ò½ºÀÇ ÄõÅÍ´Ï¿ÂÀ¸·ÎºÎÅÍ ±¸ÃàµÈ
D3DXMATRIX ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
* Quaternion»çÀÌÀÇ º¸°£
D3DXQUATERNION *
D3DXQuaternionSlerp(
D3DXQUATERNION *pOut, // [in, out] ¿¬»ê °á°úÀÎ
D3DXQUATERNION ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
CONST
D3DXQUATERNION *pQ1, //
in ó¸®ÀÇ ±âº»À¸·Î µÇ´Â
D3DXQUATERNION ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
CONST
D3DXQUATERNION *pQ2, //
in ó¸®ÀÇ ±âº»À¸·Î µÇ´Â
D3DXQUATERNION ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
FLOAT t ); //
in º¸°£ ÇÏ´Â ÄõÅʹϿ°£ÀÇ °£°ÝÀ» ³ªÅ¸³»´Â ÆĶó¹ÌÅÍ.
¹Ýȯ°ª; º¸°£ °á°úÀÎ
D3DXQUATERNION ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ.
¸Þ¸ðÀåÀ¸·Î °¡±â