Sample 1 - D3D Cubic
À̹ø ¿¹Á¦´Â Direct3D Retained Mode (D3D RM)ÀÇ Ã¹ ¹øÂ° ¿¹Á¦·Î½á °¡Àå ±âº»ÀûÀÎ ¼³Á¤¿¡ ´ëÇØ ¾Ë¾Æº¼ °ÍÀÌ´Ù. MFCÀÇ ºä-µµÅ¥¸ÕÆ® ±¸Á¶¸¦ ÀÌ¿ëÇÒ °ÍÀε¥, ¿©±â¼ÀÇ ÄÚµå´Â ¸ðµÎ ºä Ŭ·¡½º¿¡¼¸¸ ±â¼úµÉ °ÍÀÌ´Ù. Äڵ带 ÀÛ¼ºÇϱâ Àü¿¡ DirectX SDK¸¦ ¸ÕÀú ¹Þ¾Æ¼ ¼³Ä¡ÇØ¾ß ÇÒ °ÍÀÌ´Ù. ¿©±â¼´Â 7.0 ¹öÀüÀÇ SDK¸¦ »ç¿ëÇßÁö¸¸ ½ÇÁ¦·Î ´ÙÀ½ÀÇ ÄÚµå´Â ¾Æ¸¶ direct x 3.0 ¹öÀü¿¡¼µµ ÄÄÆÄÀ쵃 °ÍÀÌ´Ù. »óÀ§ ¹öÀüÀÇ ±â´ÉÀ» ÀÌ¿ëÇÏ´Â ¿¹Á¦´Â ³ªÁß¿¡ ´Ù½Ã »ìÆìº¼ °ÍÀÌ´Ù.
¿¹Á¦ÀÇ °á°ú¸¦ °£´ÜÈ÷ ¼³¸íÇÏÀÚ¸é DirectX.bmp ¶ó´Â ÆÄÀÏÀ» Àоîµé¿©¼ À°¸éü¿¡ ÅØ½ºÃ³¸¦ ÀÔÈ÷´Â ¿¹Á¦ÀÌ´Ù.
¼Ò½º´Â ¿©±â¼ ¹ÞÀ¸¸é µÇÁö¿ä. (ºñÆ®¸Ê ÆÄÀÏÀº ¸®¼Ò½º¿¡¼ º¹»çÇØ¼ ³ÖÀ¸¸é µË´Ï´Ù.)
1. SDI, ÇÁ·ÎÁ§Æ® À̸§Àº D3DCubicÀ¸·Î Á¤ÇÑ´Ù.
2. ¸Þ´º¿¡¼ Project - Settings.. - Link¿¡¼ Object/library modules ¿¡ ´ÙÀ½À» ½á³Ö´Â´Ù.
d3drm.lib ddraw.lib
3. ÅØ½ºÃ³, À°¸éü, ³ë¸Öº¤ÅÍ¿¡ °üÇÑ µ¥ÀÌÅ͸¦ ºäÀÇ cppÆÄÀÏÀÇ ¾ÕºÎºÐ¿¡ Ãß°¡ÇÑ´Ù.
int faces[] = { 4, 0, 1, 1, 1, 2, 1, 3, 1, //
À§ÂÊ
4,
4, 3, 5, 3, 6, 3, 7, 3, // ¾Æ·¡ÂÊ
4,
8, 2, 9, 2, 10, 2, 11, 2, // ¿À¸¥ÂÊ
4,
12, 0, 13, 0, 14, 0, 15, 0, // ¿ÞÂÊ
4,
16, 4, 17, 4, 18, 4, 19, 4, // ¾ÕÂÊ
4,
20, 5, 21, 5, 22, 5, 23, 5, // µÚÂÊ
0
};
D3DVECTOR cubicVertices[] = { 1.0f,
1.0f, -1.0f, // 0
-1.0f,
1.0f, -1.0f, // 1
-1.0f,
1.0f, 1.0f, // 2
1.0f,
1.0f, 1.0f, // 3
1.0f,
-1.0f, -1.0f, // 4
1.0f,
-1.0f, 1.0f, // 5
-1.0f,
-1.0f, 1.0f, // 6
-1.0f,
-1.0f, -1.0f, // 7
1.0f,
1.0f, -1.0f, // 8
1.0f,
1.0f, 1.0f, // 9
1.0f,
-1.0f, 1.0f, // 10
1.0f,
-1.0f, -1.0f, // 11
-1.0f,
1.0f, -1.0f, // 12
-1.0f,
-1.0f, -1.0f, // 13
-1.0f,
-1.0f, 1.0f, // 14
-1.0f,
1.0f, 1.0f, // 15
1.0f,
1.0f, -1.0f, // 16
1.0f,
-1.0f, -1.0f, // 17
-1.0f,
-1.0f, -1.0f, // 18
-1.0f,
1.0f, -1.0f, // 19
1.0f,
1.0f, 1.0f, // 20
-1.0f,
1.0f, 1.0f, // 21
-1.0f,
-1.0f, 1.0f, // 22
1.0f,
-1.0f, 1.0f, // 23
};
D3DVECTOR
cubicNormals [] = { -1.0f, 0.0f, 0.0f, //
0 - ¿ÞÂÊ
0.0f,
1.0f, 0.0f, // 1 - À§ÂÊ
1.0f,
0.0f, 0.0f, // 2 - ¿À¸¥ÂÊ
0.0f,
-1.0f, 0.0f, // 3 - ¾Æ·¡ÂÊ
0.0f,
0.0f, -1.0f, // 4 - ¾ÕÂÊ(-z¹æÇâ)
0.0f,
0.0f, 1.0f // 5 - µÚÂÊ(+z¹æÇâ)
};
4. ºäÀÇ Çì´õÆÄÀÏ¿¡ ´ÙÀ½ ¸â¹öº¯¼ö¸¦ Ãß°¡ÇÑ´Ù.
// Attributes
public:
LPDIRECT3DRM
pD3DRM; //
Direct3D retained mode Object
LPDIRECT3DRMFRAME
pD3DSceneFrame; // Direct3D Scene Frame
LPDIRECT3DRMFRAME
pD3DCameraFrame; // Direct3D Camera Frame
LPDIRECTDRAWCLIPPER
pDDClipper; // DirectDraw
Clipper
LPDIRECT3DRMDEVICE
pD3DRMDevice; // Direct3D Device
LPDIRECT3DRMVIEWPORT
pD3DViewport; // Direct3D Viewport
5. ºäÀÇ »ý¼ºÀÚ¿¡¼ ¸â¹öº¯¼öµé¿¡ ´ëÇÑ Ãʱâȸ¦ ÇÑ´Ù.
CD3DCubicView::CD3DCubicView()
{
//
TODO: add construction code here
pD3DRM
= NULL;
pD3DSceneFrame =
NULL;
pD3DCameraFrame = NULL;
pDDClipper
= NULL;
pD3DRMDevice = NULL;
pD3DViewport
= NULL;
}
6. D3D RMÀÇ ¼³Á¤À» ÇÏ´Â ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù. Äڵ带 º¸¸é ¾Ë ¼ö ÀÖ°ÚÁö¸¸ ÀÌ ÇÔ¼ö¿¡¼ D3D RMÀÇ ÀÎÅÍÆäÀ̽º¸¦ »ý¼ºÇϰí, Scene ÇÁ·¹ÀÓ, Camera ÇÁ·¹ÀÓ, Ŭ¸®ÆÛ, µð¹ÙÀ̽º, ºäÆ÷Æ®, ·»´õ¸µ µîÀÇ ¼³Á¤À» ÇÑ´Ù.
BOOL CD3DCubicView::SetupD3DRM()
{
//
Direct3D RM ÀÎÅÍÆäÀ̽º »ý¼º
if(Direct3DRMCreate(&pD3DRM)
!= D3DRM_OK) {
::AfxMessageBox("Direct3D
Retained Mode Interface Creation failure!");
return
FALSE;
}
//
Scene Frame »ý¼º
if(pD3DRM->CreateFrame(NULL,
&pD3DSceneFrame) != D3DRM_OK) {
::AfxMessageBox("Scene
Frame Creation Failure!");
return
FALSE;
}
//
Camera Frame »ý¼º
if(pD3DRM->CreateFrame(pD3DSceneFrame,
&pD3DCameraFrame) != D3DRM_OK) {
::AfxMessageBox("Camera
Frame Creation Failure!");
return
FALSE;
}
//
Ŭ¸®ÆÛ¸¦ »ý¼ºÇϰí À©µµ¿ì¿Í °áÇÕÇÑ´Ù.
if(DirectDrawCreateClipper(0,
&pDDClipper, NULL) != DD_OK) {
::AfxMessageBox("Could
not create clipper!");
return
FALSE;
}
if(pDDClipper->SetHWnd(0,
m_hWnd) != DD_OK) {
::AfxMessageBox("Could
not associate clipper with window!");
return
FALSE;
}
//
Device »ý¼º
if(!CreateDevice())
{
::AfxMessageBox("Device
Creation Failure!");
return
FALSE;
}
//
Viewport »ý¼º
if(!CreateViewport())
{
::AfxMessageBox("Viewport
Creation Failure!");
return
FALSE;
}
//
±¤¿ø »ý¼º
if(!SetRenderingLights())
{
::AfxMessageBox("Lights
Creation Failure!");
return
FALSE;
}
//
Scene Rendering
if(!RenderingScene())
{
::AfxMessageBox("Scene
Creation Failure!");
return
FALSE;
}
return
TRUE;
}
7. OnInitialUpdate() ÇÔ¼ö¿¡¼ ´ÙÀ½°ú °°ÀÌ SetupD3DRM() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
void CD3DCubicView::OnInitialUpdate()
{
CView::OnInitialUpdate();
//
TODO: Add your specialized code here and/or call the base class
if(!SetupD3DRM())
PostQuitMessage(0);
}
8. µð¹ÙÀ̽º¸¦ ¼³Á¤ÇÏ´Â CreateDevice() ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
BOOL CD3DCubicView::CreateDevice()
{
RECT
rect;
// ÇöÀçÀÇ À©µµ¿ì
¿µ¿ªÀ» Á¤ÇÑ´Ù.
GetClientRect(&rect);
if(!rect.right
|| !rect.bottom)
return
FALSE;
// µð¹ÙÀ̽º »ý¼º
if(pD3DRM->CreateDeviceFromClipper(pDDClipper,
NULL,
rect.right,
rect.bottom, &pD3DRMDevice) != D3DRM_OK) {
return
FALSE;
}
return
TRUE;
}
9. ºäÆ÷Æ®¸¦ ¼³Á¤ÇÏ´Â CreateViewport() ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
BOOL CD3DCubicView::CreateViewport()
{
//
Viewport »ý¼º
if(pD3DRM->CreateViewport(pD3DRMDevice,
pD3DCameraFrame,
0,
0, pD3DRMDevice->GetWidth(), pD3DRMDevice->GetHeight(),
&pD3DViewport)
!= D3DRM_OK)
return
FALSE;
return TRUE;
}
10. ±¤¿øÀ» ¼³Á¤Çϰí, ¹è°æ»öµµ Á¤Çϰí, Quality µµ Á¤ÇÏ´Â ÇÔ¼ö - SetRenderingLights()
BOOL CD3DCubicView::SetRenderingLights()
{
LPDIRECT3DRMLIGHT
pAmbient = NULL;
LPDIRECT3DRMLIGHT
pPoint = NULL;
// point
±¤¿ø »ý¼º
if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_POINT,
0.4f,
0.4f, 0.4f, &pPoint)))
return
FALSE;
if(FAILED(pD3DSceneFrame->AddLight(pPoint)))
return
FALSE;
// ambient ±¤¿ø
»ý¼º
if(FAILED(pD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT,
0.8f,
0.8f, 0.8f, &pAmbient)))
return
FALSE;
if(FAILED(pD3DSceneFrame->AddLight(pAmbient)))
return
FALSE;
// Scene ¹è°æ»öÀ»
ȸ»öÀ¸·Î ¼³Á¤
pD3DSceneFrame->SetSceneBackground(D3DRGB(0.5,
0.5, 0.5));
// Quality
¼³Á¤
pD3DRMDevice->SetQuality(D3DRMRENDER_GOURAUD);
return
TRUE;
}
11. ºñÆ®¸ÊÀ» ºÒ·¯¿Í¼ ·»´õ¸µÀ» ÇÏ´Â ÇÔ¼ö.
BOOL CD3DCubicView::RenderingScene()
{
//
Mesh builder interface
LPDIRECT3DRMMESHBUILDER
pMeshBuilder = NULL;
LPDIRECT3DRMFRAME
pCubicFrame = NULL; // CubicÀ» Æ÷ÇÔÇÒ ÇÁ·¹ÀÓ
LPDIRECT3DRMTEXTURE
pTexture = NULL;
// Mesh
builder »ý¼º
if(FAILED(pD3DRM->CreateMeshBuilder(&pMeshBuilder)))
return
FALSE;
// Texture Load
if(FAILED(pD3DRM->LoadTexture("directx.bmp",
&pTexture)))
return
FALSE;
// Á¤Á¡ ¹è¿·ÎºÎÅÍ
ÆäÀ̽º¸¦ ·ÎµåÇÑ´Ù.
pMeshBuilder->AddFaces(24,
cubicVertices, 24,
cubicNormals,
(unsigned long *)faces, NULL);
pMeshBuilder->SetColor(D3DRGB(1,
1, 1));
pMeshBuilder->SetTexture(pTexture);
//
Texture Mapping
for(int i=0;
i<24; i+=4) {
pMeshBuilder->SetTextureCoordinates(i,
0.0f, 0.0f);
pMeshBuilder->SetTextureCoordinates(i+1,
1.0f, 0.0f);
pMeshBuilder->SetTextureCoordinates(i+2,
1.0f, 1.0f);
pMeshBuilder->SetTextureCoordinates(i+3,
0.0f, 1.0f);
}
//
Frame »ý¼º
if(FAILED(pD3DRM->CreateFrame(pD3DSceneFrame,
&pCubicFrame)))
return
FALSE;
// Frame¿¡ Mesh
Builder Ãß°¡
if(FAILED(pCubicFrame->AddVisual(pMeshBuilder)))
return
FALSE;
// Camera Frame
À§Ä¡ ¼³Á¤
if(FAILED(pD3DCameraFrame->SetPosition(pD3DSceneFrame,
0.0f,
0.0f,
-7.0f)))
return
FALSE;
// interface Release
pCubicFrame->Release();
pMeshBuilder->Release();
pTexture->Release();
return
TRUE;
}
12. OnDraw() ÇÔ¼ö ´ë½Å¿¡ OnPaint() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
void CD3DCubicView::OnPaint()
{
CPaintDC
dc(this); // device context for painting
//
TODO: Add your message handler code here
if(!pD3DRMDevice
|| IsIconic())
return;
pD3DViewport->Clear();
//
Viewport Clear
pD3DViewport->Render(pD3DSceneFrame);
// Scene Rendering
pD3DRMDevice->Update();
//
Device Update
// Do not call
CView::OnPaint() for painting messages
}
13. À©µµ¿ìÀÇ Å©±â°¡ ¹Ù²ñ¿¡ µû¶ó µð¹ÙÀ̽º¿Í ºäÆ÷Æ®¸¦ ´Ù½Ã ¼³Á¤ÇÑ´Ù.
void CD3DCubicView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType,
cx, cy);
// TODO: Add
your message handler code here
if(!pD3DViewport)
return;
if(!pD3DRMDevice)
return;
int width = cx;
int
height = cy;
if(!width ||
!height || IsIconic()) return;
//
Device¿Í ViewportÀÇ ÇöÀç Æø°ú ³ôÀ̸¦ ¾ò´Â´Ù.
int
vWidth = pD3DViewport->GetWidth();
int
vHeight = pD3DViewport->GetHeight();
int
dWidth = pD3DRMDevice->GetWidth();
int
dHeight = pD3DRMDevice->GetHeight();
//
window Å©±â¿¡ º¯ÇÔÀÌ ¾øÀ¸¸é ¸®ÅÏÇÑ´Ù.
if(vWidth
== width && vHeight == height) return;
//
¾Æ´Ï¸é Device¿Í Viewport¸¦ ´Ù½Ã »ý¼ºÇÑ´Ù.
pD3DViewport->Release();
pD3DRMDevice->Release();
if(!CreateDevice())
{
::AfxMessageBox("Device
Creation Failure!");
PostQuitMessage(0);
}
if(!CreateViewport())
{
::AfxMessageBox("Viewport
Creation Failure!");
PostQuitMessage(0);
}
}
14. Űº¸µåÀÇ È»ìÇ¥ Ű¿¡ µû¶ó À°¸éü°¡ ¿òÁ÷À̵µ·Ï ÇÑ´Ù.
void CD3DCubicView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//
TODO: Add your message handler code here and/or call default
LPDIRECT3DRMFRAMEARRAY
pFrameArray; // Frame Array
LPDIRECT3DRMFRAME
pChildFrame; // ¾ò°íÀÚÇÏ´Â Frame
//
Frame Array¸¦ ¾ò´Â´Ù.
pD3DSceneFrame->GetChildren(&pFrameArray);
//
¿ì¸®°¡ ¿øÇÏ´Â FrameÀ» ¾ò´Â´Ù.
pFrameArray->GetElement(1,
&pChildFrame);
//
FrameÀ» rotateÇÑ´Ù.
if(nChar
== VK_UP)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
1.0f, 0.0f, 0.0f, 0.1f);
if(nChar
== VK_DOWN)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
1.0f, 0.0f, 0.0f, -0.1f);
if(nChar
== VK_LEFT)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
0.0f, 1.0f, 0.0f, 0.1f);
if(nChar
== VK_RIGHT)
pChildFrame->AddRotation(D3DRMCOMBINE_AFTER,
0.0f, 1.0f, 0.0f, -0.1f);
pFrameArray->Release();
pChildFrame->Release();
InvalidateRect(NULL,
FALSE); // À©µµ¿ì¸¦ ´Ù½Ã ±×¸°´Ù.
CView::OnKeyDown(nChar,
nRepCnt, nFlags);
}
- the end of this article -