DirectX Graphics ÇÁ·Î±×·¡¹Ö °¡ÀÌµå Æ©Å丮¾ó, »ùÇÃ, Åø, ÈùÆ® »ùÇà »ùÇà ÇÁ·¹ÀÓ¿öÅ©(framework) [¸ñÂ÷¿¶÷] [ÁÖ¼Òº¹»ç] [½½·Ôºñ¿ì±â]
|
| Microsoft DirectX 9.0 |
Microsoft® DirectX® 9.0 ¹× Microsoft Direct3D® ¼ÒÇÁÆ®¿þ¾î °³¹ß Ŷ (SDK)ÀÇ ±×·¡ÇȽº »ùÇà ÇÁ·¹ÀÓ¿öÅ©(framework)´Â, DirectX 8.0 ÀÇ ±×·¡ÇȽº »ùÇà ÇÁ·¹ÀÓ¿öÅ©(framework)·ÎºÎÅÍ ¹ßÀüÇÑ °ÍÀÌ´Ù. SDK ÀÇ »ùÇÃÀº, µðÆúÆ®·Î (SDK ·çÆ®) \Samples\C++ ¿¡ ÀνºÅç µÈ´Ù. ¿©±â¼ ÁÖ¸ñÇÏ´Â Æú´õ´Â Common ¿Í Direct3D ÀÌ´Ù. Common Æú´õ¿¡´Â »ùÇà ÇÁ·¹ÀÓ¿öÅ©(framework)°¡ µé¾î°¡ ÀÖ´Ù. Direct3D Æú´õ¿¡´Â, ÀÌ·¯ÇÑ ±×·¡ÇȽº ÇÁ·¹ÀÓ¿öÅ©(framework)¿¡ ±Ù°ÅÇÏ´Â Direct3D »ùÇÃÀÌ µé¾î°¡ ÀÖ´Ù.
±×·¡ÇȽº ÇÁ·¹ÀÓ¿öÅ©(framework)´Â, 5 °³ÀÇ ¼Ò½º ¸ðµâ·ÎºÎÅÍ ±¸¼ºµÇ¾î ÀÖ´Ù.
´ëÀÀÇÏ´Â Çì´õ ÆÄÀÏÀº (SDK ·çÆ®) \Samples\C++\Common\Include Æú´õ¿¡ ÀÖ´Ù.
°¢ »ùÇÃÀº, CD3DApplication ÀÇ ¼ºê Ŭ·¡½º (ÀϹÝÀûÀ¸·Î CMyD3DApplication ¶ó°í ¸í¸íµÈ´Ù)¿Í ´ÙÀ½¿¡ ³ªÅ¸³»´Â ÀÏ·ÃÀÇ ¿À¹ö¶óÀ̵å(override) °¡´ÉÇÑ ¸Þ¼µå¸¦ ó¸® ÇÑ´Ù.
// Overridable functions for the 3-D scene created by the application.
virtual HRESULT ConfirmDevice(D3DCAPS9*, DWORD, D3DFORMAT) { return S_OK; }
virtual HRESULT OneTimeSceneInit() { return S_OK; }
virtual HRESULT InitDeviceObjects() { return S_OK; }
virtual HRESULT RestoreDeviceObjects() { return S_OK; }
virtual HRESULT FrameMove() { return S_OK; }
virtual HRESULT Render() { return S_OK; }
virtual HRESULT InvalidateDeviceObjects() { return S_OK; }
virtual HRESULT DeleteDeviceObjects() { return S_OK; }
virtual HRESULT FinalCleanup() { return S_OK; }
/*
The prototypes for these methods are contained in D3dapp.h in the
CD3Dapplication class. The samples create a new
application and override those methods that are needed by the
application.
*/
ÀÌ ¿¹¿¡¼´Â, ¿À¹ö¶óÀ̵å(override) °¡´ÉÇÑ ¸Þ¼µåÀÇ ¼ºê ¼¼Æ®¸¦ »ç¿ëÇÑ´Ù. Ŭ·¡½º CMyD3DApplication ´Â, ´ÙÀ½ÀÇ ¸Þ¼µå¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. ´ÙÀ½¿¡, ÀÌ °¢ ¸Þ¼µå¿¡ ´ëÇØ ¼³¸íÇÑ´Ù.
class CMyD3DApplication : public CD3DApplication
{
public:
CMyD3DApplication();
protected:
HRESULT ConfirmDevice( D3DCAPS9*, DWORD, D3DFORMAT );
HRESULT DeleteRestoreDeviceObjects();
HRESULT RestoreDeviceObjects();
HRESULT FrameMove();
HRESULT Render();
private:
LPDIRECT3DVERTEXBUFFER9 m_pVB; // Vertex buffer to hold vertices
ÄÜÆ®¶óũŸ´Â, À©µµ¿ì ŸÀÌÆ²ÀÇ ÃʱâÈ, ±íÀÌ ¹öÆÛ¸µÀÇ À¯È¿È, ¹× Á¤Á¡ ¹öÆÛÀÇ Ãʱâȸ¦ ½Ç½ÃÇÑ´Ù.
CMyD3DApplication::CMyD3DApplication()
{
m_strWindowTitle = _T("D3D Example"); // title bar string
m_bUseDepthBuffer = TRUE; // enable depth buffer
m_pVB = NULL; // initialize
}À©µµ¿ì ŸÀÌÆ²Àº, ¾ÖÇø®ÄÉÀ̼ÇÀ» ±âµ¿ Çϸé ŸÀÌÆ² ¹Ù ¶Ç´Â À©µµ¿ì Ŭ·¡½º¿¡ Ç¥½ÃµÇ´Â ¿ÍÀ̵å ij¸¯ÅÍ ¶óÀÎÀÌ´Ù. À̰ÍÀº ¿É¼ÇÀÌ´Ù.
base class´Â, ±íÀÌ ¹öÆÛ¸¦ À¯È¿ÇϰÔÇϱâ À§ÇÑ ¸â¹ö º¯¼ö¸¦ Æ÷ÇÔÇÑ´Ù. ÀÌ ºÒ¸®¾ð °ªÀÇ µðÆúÆ®°ªÀº FALSE ·Î, ±íÀÌ ¹öÆÛ´Â ¹«È¿°¡ µÈ´Ù.
À©µµ¿ì ŸÀÌÆ²Àº, Unicode ¿Í ANSI ¹®ÀÚ¸¦ Áö¿ø ÇÏ´Â TCHAR ij¸¯ÅÍ ¶óÀÎÀÌ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀÇ ±âµ¿½Ã¿¡, ŸÀÌÆ² ¹Ù¿¡ Ç¥½ÃµÈ´Ù. ÀÌ Ä³¸¯ÅÍ ¶óÀÎÀº CMyD3DApplication ÀÇ À¯È¿±â°£Áß, º¸°ü À¯ÁöµÈ´Ù.
prototype´Â, ´ÙÀ½°ú °°ÀÌ µÈ´Ù.
HRESULT ConfirmDevice(D3DCAPS *pCaps, DWORD dwBehavior, D3DFORMAT fmtBackBuffer) }
[in] pCaps - È®ÀÎ ´ë»ó ÀåÄ¡ÀÇ D3DCAPS ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ. ÀÌ ±¸Á¶Ã¼ÀÇ ¸â¹ö¸¦ Á¶»çÇØ, ÁöÁ¤µÈ ÀåÄ¡¿¡ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÇÊ¿ä·Î ÇÏ´Â ´É·ÂÀÌ ÀÖÀ»Áö ¾î¶³Áö¸¦ ÆÇ´ÜÇÑ´Ù.
[in] dwBehavior - IDirect3D9::CreateDevice ÀÇ µ¿ÀÛ Ç÷¡±×¿¡ ´ëÀÀÇÏ´Â 0 ȤÀº º¹¼ö°³ÀÇ Ç÷¡±×. ´ÙÀ½ÀÇ Ç÷¡±×´Â ÁöÁ¤µÈ ÀåÄ¡ÀÇ µ¿ÀÛÀ» ³ªÅ¸³½´Ù.
D3DCREATE_PUREDEVICE D3DCREATE_HARDWARE_VERTEXPROCESSING D3DCREATE_SOFTWARE_VERTEXPROCESSING D3DCREATE_MIXED_VERTEXPROCESSING }
CD3DApplication ´Â ´ÙÀ½ÀÇ ¼ø¼·Î ÀåÄ¡ÀÇ µ¿ÀÛÀ» È®ÀÎÇÑ´Ù.
Ç»¾î ÀåÄ¡ µ¿ÀÛ¿¡ ´ëÇØ¼´Â, Ç»¾î ÀåÄ¡¿¡ ´ëÇÑ Áö¿øÀÌ ³ªÅ¸³ª°í ÀÖ´Â ÀåÄ¡¸¸À» È®ÀÎÇÑ´Ù.
Çϵå¿þ¾î Á¤Á¡ 󸮿¡ ´ëÇØ¼´Â, Çϵå¿þ¾î¿¡ ÀÇÇÑ º¯È¯°ú Á¶¸í¿¡ ´ëÇÑ Áö¿øÀÌ ³ªÅ¸³ª°í ÀÖ´Â ÀåÄ¡¸¸À» È®ÀÎÇÑ´Ù.
[in] fmtBackBuffer - ÀåÄ¡ÀÇ µðÆúÆ®ÀÇ ½º¿Ò üÀο¡ °ü·ÃµÈ ¹é ¹öÆÛÀÇ ÁöÁ¤µÈ Æ÷¸Ë.
ÀÌ ¸Þ¼µå¸¦ ¿À¹ö¶óÀ̵å(override) ÇÒ ¶§, ÁöÁ¤µÈ ÀåÄ¡ÀÇ ´É·Â, µ¿ÀÛ ¹× ¹é ¹öÆÛ Æ÷¸ËÀ» Çã¿ë ÇÒ ¼ö ÀÖ´Â °ÍÀÎ °æ¿ì´Â, ¾ÖÇø®ÄÉÀ̼ǿ¡¼´Â S_OK ¸¦ µ¹·ÁÁÙ Çʿ䰡 ÀÖ´Ù. ±× ÀÌ¿ÜÀÇ °æ¿ì´Â, E_FAIL ¸¦ µ¹·ÁÁÙ Çʿ䰡 ÀÖ´Ù.
DeleteDeviceObjects ´Â, ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¾·á ÇÒ ¶§ ¶Ç´Â ÀåÄ¡¸¦ º¯°æÇÒ °æ¿ì¿¡ È£ÃâµÈ´Ù. Á¤Á¡ ¹öÆÛ µî, ÀåÄ¡¿¡ ÀÇÁ¸ÇÏ´Â °³Ã¼¸¦ »èÁ¦ÇÒ °æ¿ì¿¡ ÀÌ ¸Þ¼µå¸¦ »ç¿ëÇÑ´Ù.
HRESULT CVShader1::DeleteDeviceObjects()
{
m_pQuadVB->Release();
m_pQuadVB = NULL;
return S_OK;
ÀÌ ¸Þ¼µå´Â, ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î ÀåÄ¡ ¸Þ¸ð¸® °³Ã¼ ¹× ÀåÄ¡ ½ºÅ×ÀÌÆ®¸¦ º¹¿øÇÒ Çʿ䰡 ÀÖÀ» ¶§ È£ÃâµÈ´Ù. DirectX ÀåÄ¡¸¦ »ý¼º ¶Ç´Â »çÀÌÁî º¯°æÇßÀ» ¶§¿¡´Â, À̰ÍÀÌ ÇÊ¿äÇÏ°Ô µÈ´Ù. ÀÌ ¸Þ¼µå´Â, °³Ã¼ÀÇ »ý¼º°ú ·»´õ¸µ ½ºÅ×ÀÌÆ®ÀÇ ÃʱâÈ¿¡ °üÇÑ ´ëºÎºÐÀÇ ÀÛ¾÷À» ½Ç½ÃÇÑ´Ù.
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
// Create the vertex buffer.Allocate enough memory (from the default pool)
// to hold the custom vertices.Specify the flexible vertex format (FVF),
// so the vertex buffer knows what data it contains.
if( FAILED( m_pd3dDevice->CreateVertexBuffer(
NUM_VERTS*sizeof(CUSTOMVERTEX),
0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB ) ) )
{
return E_FAIL;
}
// Fill the vertex buffer.First, lock the vertex buffer to get access to
// the vertices.This mechanism is required because vertex buffers
// may be in device memory.Then use memcpy to do a fast data copy.
VOID* pVertices;
if( FAILED( m_pVB->Lock( 0, sizeof(g_Vertices),
(BYTE**) &pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
m_pVB->Unlock();
// Set the projection matrix.The size of the back buffer comes from the
// base class.
D3DXMATRIX matProj;
FLOAT fAspect = m_d3dsdBackBuffer.Width /
(FLOAT) m_d3dsdBackBuffer.Height;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspect,
1.0f, 100.0f );
m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
// Set up the view matrix.A view matrix can be defined from an eye
// point, a look-at point, and an up-direction vector.In this example,
// the eye position is (0,1,-4) the look-at point is (0,0,0) and the
// up vector is (0,1,0).
D3DXMATRIX matView;
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 1.0f,-4. 0f ),
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
// Set up default texture states.
// Set up render states (this is only one example render state).
m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
return S_OK;
ÀÌ ¸Þ¼µå´Â, Á¤Á¡ ¹öÆÛ¸¦ »ý¼º ÇØ, ±× Áß¿¡ Á¤Á¡ µ¥ÀÌÅ͸¦ º¹»ç ÇÑ´Ù. ºä Çà·Ä ¹× Åõ¿µ Çà·Äµµ »ý¼º ÇÑ´Ù. ÀÌ·¯ÇÑ Çà·ÄÀº, Á¤Á¡ ¹öÆÛ³»ÀÇ °³Ã¼¿¡ ´ëÇÑ Ä«¸Þ¶óÀÇ ¹æÇâÀ» Á¤ÀÇÇÑ´Ù. ÀÌ ¿¹¿¡¼´Â °¡Áö ¾ÊÁö¸¸, ÀÌ ¸Þ¼µå·Î ÅØ½ºÃ³ ½ºÅ×ÀÌÁö ½ºÅ×ÀÌÆ®¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. º¯°æµÉ °¡´É¼ºÀÇ ³·Àº ·»´õ¸µ ½ºÅ×ÀÌÆ®°¡ ¼³Á¤µÈ´Ù. À̰͵鿡 ÀÇÇØ, Àå¸é(scene)ÀÇ ·»´õ¸µ ¹æ¹ýÀÌ Á¤ÇØÁø´Ù.
ÀÌ ¸Þ¼µå¿¡´Â, ¾Ö´Ï¸ÞÀ̼ǰú °°ÀÌ 1 ÇÁ·¹ÀÓ ¸¶´Ù ÀϾ´Â ¾×¼ÇÀ» ³Ö´Â´Ù. ÀÌ ¿¹¿¡¼´Â, ¿ùµå º¯È¯¿¡, y ÃàÀ» Áß½ÉÀ¸·Î ÇÑ È¸ÀüÀ» ´õÇϰí ÀÖ´Ù.
HRESULT CMyD3DApplication::FrameMove()
{
// For our world matrix, just rotate the object about the y-axis.
D3DXMATRIX matWorld;
D3DXMatrixRotationY( &matWorld, ::TimeGetTime()/150. 0f );
m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
return S_OK;
}
Windows ¸Þ¼µå ::TimeGetTime()´Â, ÇöÀç ½Ã°¢À» µ¹·ÁÁØ´Ù. À̰ÍÀ» 150 À¸·Î ³ª´©¸é °³Ã¼¸¦ ÀÏÁ¤ °¢µµ¾¿ ȸÀü ÇÒ ¶§ÀÇ 1 ȸ ºÐÀÇ È¸Àü °¢µµ¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
ÀÌ ¸Þ¼µå´Â, Ãâ·ÂÀ» ·»´õ¸µ ÇÒ °æ¿ì¿¡ È£ÃâµÈ´Ù. ºäÆ÷Æ®¸¦ Ŭ¸®¾î ÇØ, Àå¸é(scene)¿Í ½ºÅ×ÀÌÆ®ÀÇ º¯°æÀ» ·»´õ¸µ ÇÑ´Ù.
HRESULT CMyD3DApplication::Render()
{
// Clear the viewport.
m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,0), 1.0f, 0L );
// Begin the scene.
if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
{
m_pd3dDevice->SetStreamSource( 0, m_pVB, sizeof(CUSTOMVERTEX) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, NUM_TRIS );
m_pd3dDevice->EndScene();
}
return S_OK;
}
Render ¸Þ¼µå´Â, ¿ì¼±, Clear ¸¦ »ç¿ëÇØ ºäÆ÷Æ®¸¦ Ŭ¸®¾î ÇÑ´Ù. ´ÙÀ½¿¡, ´ë°¡ µÈ BeginScene ¿Í EndScene ÀÇ »çÀÌ¿¡, SetStreamSource ¸¦ »ç¿ëÇØ, Ä¿½ºÅÒ Á¤Á¡ ŸÀÔÀÇ »çÀÌÁîÀÇ º¸Æø°ú ÇÔ²² Á¤Á¡ ¹öÆÛ m_pVB ¸¦ »ç¿ëÇÏ´Â °ÍÀ» ·±Å¸ÀÓ¿¡°Ô ÀüÇÑ´Ù. ´ÙÀ½¿¡, °¡Àå ´Ü¼øÇÑ Å¸ÀÔÀÇ À¯¿¬ÇÑ Á¤Á¡ Æ÷¸Ë (FVF) ¼ÎÀÌ´õ¸¦ »ç¿ëÇÏ´Â °ÍÀ» ·±Å¸ÀÓ¿¡°Ô ÀüÇÑ´Ù. ¸¶Áö¸·À¸·Î, DrawPrimitive ¸¦ È£ÃâÇØ »ç°¢ÇüÀ» ·»´õ¸µ ÇÑ´Ù.
DeleteDeviceObjects ´Â, ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¾·á ÇÒ ¶§ ¶Ç´Â ÀåÄ¡¸¦ º¯°æÇÒ °æ¿ì¿¡ È£ÃâµÈ´Ù. ÀÌ ¸Þ¼µå´Â, ÀåÄ¡¿¡ ÀÇÁ¸ÇÏ´Â °³Ã¼¸¦ »èÁ¦Çϱâ À§Çؼ »ç¿ëÇÑ´Ù.
ConfirmDevice ´Â, ÀåÄ¡°¡ ÃÖ¼ÒÇÑÀÇ ±â´É ¼¼Æ®¸¦ °®Ãß°í ÀÖ´ÂÁö¸¦ üũÇÑ´Ù. ÀÌ ¸Þ¼µå´Â, ÀåÄ¡ÀÇ ÃʱâÈÁß¿¡ È£ÃâµÈ´Ù.
InvalidateDeviceObjects ´Â, ÀåÄ¡¿¡ ÀÇÁ¸ÇÏ´Â °³Ã¼°¡ »èÁ¦µÉ °¡´É¼ºÀÌ ÀÖÀ» ¶§ È£ÃâµÈ´Ù. º¸Åë, ÀÌ ¸Þ¼µå¿¡´Â, Á¤Á¡ ¹öÆÛµîÀÇ ÀåÄ¡¿¡ ÀÇÁ¸ÇÏ´Â °³Ã¼¸¦ Ãß°¡ÇÑ´Ù.
OneTimeSceneInit ´Â, ÃÖÃÊÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç ±âµ¿½Ã¿¡ ½ÇÇàÇÒ Çʿ䰡 ÀÖ´Â ÄÚµå¿ëÀÌ´Ù.
±×·¡ÇȽº¸¦ Ãë±ÞÇϰí ÀÖ´Â ´Ù¸¥ °³¹ßÀÚ°¡ ¹ß°ßµÇ´Â Àå¼ÒÀÇ 1 °³¿¡, DirectX °³¹ßÀÚÀÇ ¸ÞÀϸµ¸®½ºÆ®°¡ ÀÖ´Ù. À̰ÍÀº DirectX °³¹ßÀÚÀü¿ëÀÇ ±â¼úÀûÀÎ µð½ºÄ¿¼ÇÀÇ Æ÷·³À̸ç, ±×·¡ÇȽº, ³×Æ®¿öÅ©, ¹× ÀԷ¿¡ °üÇÑ ¿µ¿ªÀ» Ä¿¹öÇϰí ÀÖ´Ù. ÀÌ ¸ÞÀϸµ¸®½ºÆ®ÀÇ ¾îÄ«À̺ê(archive)´Â,DirectX Dev
¿¡ ÀÖ´Ù. ´Ù¸¥ ¸ÞÀϸµ¸®½ºÆ®¿Í °°ÀÌ, À̰ÍÀº ±â¼ú Áö¿øÀÇ Æ÷·³Àº ¾Æ´Ï´Ù. ±×·¯³ª, DirectX ¿¡ °üÇÑ Á¤º¸ ¼Ò½º·Î¼ À¯¿ëÇÏ´Ù.