首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 架構下整合 DirectX 8 完整教學:從框架建立到貼圖立方體

     編輯:關於VC++

系列簡介

本系列以 MFC 為基礎框架,逐步建構 DirectX 8 應用程式,涵蓋框架搭建、Direct3D 初始化、三角形繪製、索引緩衝區、貼圖映射、3D 矩陣變換與 Z-Buffer 啟用,最終呈現旋轉貼圖立方體。適合已具備 MFC 基礎、欲入門 DirectX 8 的開發者。

第一章:MFC 遊戲框架 (DX8MFC)

核心類別

  • CDX8MFCApp:應用程式類別,覆寫 InitInstance、ExitInstance、OnIdle。
  • CFrameWin:主視窗類別,提供 Init、Go、Active、End、Update 等虛擬函數供衍生類擴充。

關鍵流程

// InitInstance: 建立主視窗並初始化
BOOL CDX8MFCApp::InitInstance()
{
    m_pMainWnd = new CFrameWin();
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
    Game = (CFrameWin*)m_pMainWnd;
    Game->Init();
    return TRUE;
}

// OnIdle: 遊戲主迴圈 (無訊息時持續被呼叫)
BOOL CDX8MFCApp::OnIdle(LONG lCount)
{
    if (Game->window_active == TRUE) { Game->Active(); Game->window_active = FALSE; }
    Game->Go();
    return TRUE; // 返回 TRUE 讓 OnIdle 持續被呼叫
}

第二章:Direct3D 初始化 (DX8MFC1)

InitDirect3D 步驟

  1. 建立 IDirect3D8 介面:pID3D = Direct3DCreate8(D3D_SDK_VERSION);
  2. 取得顯示模式:pID3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
  3. 設定呈現參數 (D3DPRESENT_PARAMETERS):視窗模式、交換效果、背景緩衝格式。
  4. 建立裝置 IDirect3DDevice8:CreateDevice 指定硬體頂點處理 (D3DCREATE_SOFTWARE_VERTEXPROCESSING) 以相容性優先。
  5. 關閉預設光源:pID3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

DrawScene 基本流程

HRESULT CFrameWin::DrawScene()
{
    HRESULT hr;
    do {
        hr = pID3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0,63,0,0), 0, 0); if(FAILED(hr)) break;
        hr = pID3DDevice->BeginScene(); if(FAILED(hr)) break;
        // 繪圖指令置於此處
        hr = pID3DDevice->EndScene(); if(FAILED(hr)) break;
        hr = pID3DDevice->Present(NULL, NULL, NULL, NULL);
    } while(0);
    return hr;
}

資源釋放

void CFrameWin::ShutdownDirect3D()
{
    HELPER_RELEASE(pTexture);
    HELPER_RELEASE(pIndexBuffer);
    HELPER_RELEASE(pStreamData);
    HELPER_RELEASE(pID3DDevice);
    HELPER_RELEASE(pID3D);
}

第三章:繪製三角形 (DX8MFC2)

柔性頂點格式 (FVF)

struct MYVERTEX { FLOAT x, y, z; FLOAT rhw; DWORD color; };
#define D3DFVF_MYVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

建立頂點緩衝區並填充資料

pID3DDevice->CreateVertexBuffer(sizeof(MYVERTEX)*num_elems, D3DUSAGE_WRITEONLY,
    D3DFVF_MYVERTEX, D3DPOOL_DEFAULT, &pStreamData);
MYVERTEX* v; pStreamData->Lock(0,0,(BYTE**)&v,0);
for(int i=0;iUnlock();

設定頂點著色器與資料流來源

pID3DDevice->SetVertexShader(D3DFVF_MYVERTEX);
pID3DDevice->SetStreamSource(0, pStreamData, sizeof(MYVERTEX));

繪製基本圖元

pID3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, num_elems/3);

第四章:索引三角形 (DX8MFC3)

使用 DrawIndexedPrimitive 減少重複頂點資料。建立索引緩衝區 (CreateIndexBuffer)、填充索引陣列、設定 SetIndices,最後呼叫 DrawIndexedPrimitive 繪製。

第五章:貼圖映射 (DX8MFC4)

  • 擴充 MYVERTEX 加入 tu, tv 材質座標。
  • 使用 D3DXCreateTextureFromFile 載入位圖並 SetTexture(0, pTexture)。
  • 頂點格式加入 D3DFVF_TEX1。

第六章:貼圖立方體與 3D 變換 (DX8MFC5)

啟用 Z-Buffer

present.EnableAutoDepthStencil = TRUE;
present.AutoDepthStencilFormat = D3DFMT_D16;
pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
// DrawScene 中 Clear 加入 D3DCLEAR_ZBUFFER

矩陣建立 (BuildMatrices)

void CFrameWin::BuildMatrices()
{
    D3DXMATRIX mat;
    // 世界矩陣:Y 軸旋轉
    D3DXMatrixRotationY(&mat, timeGetTime()/1000.0f);
    pID3DDevice->SetTransform(D3DTS_WORLD, &mat);
    // 視圖矩陣:相機位置 (0,3,-5) 看向原點,上方向 Y 軸
    D3DXMatrixLookAtLH(&mat, &D3DXVECTOR3(0,3,-5), &D3DXVECTOR3(0,0,0), &D3DXVECTOR3(0,1,0));
    pID3DDevice->SetTransform(D3DTS_VIEW, &mat);
    // 投影矩陣:45 度視野、4:3 比例、近平面 1、遠平面 100
    D3DXMatrixPerspectiveFovLH(&mat, D3DX_PI/4, 4.0f/3.0f, 1.0f, 100.0f);
    pID3DDevice->SetTransform(D3DTS_PROJECTION, &mat);
}

頂點結構調整

struct MYVERTEX { FLOAT x,y,z; DWORD color; FLOAT tu,tv; };

總結

本系列完整展示了在 MFC 架構下整合 DirectX 8 的完整流程,從基本框架、裝置初始化、基本圖元繪製、索引優化、貼圖映射到 3D 矩陣變換與 Z-Buffer 啟用,最終實現旋轉貼圖立方體。原始碼可從 gamedev.363.net 下載或聯繫作者 laical@21cn.com 索取。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved