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 -