您的位置:首页 > 其它

D3D初学入门一(配置开发环境及绘制D3D窗口)

2008-10-07 20:27 363 查看
  最近一直接触的都是C#的东东,好久没写C++代码了,怕手生忘记了,打算写写C++的代码。写什么好呢?想来想去,以前的工作学过接触了些OpenGL,那我就学习一下D3D吧。原以为D3D的中文入门资料会很多的,结果找了半天也没找到合适的。哎,随便将就着学吧。
  既然是来兴趣学一下,我可不想去下个超大的DirectX安装包,所以首先,当然得找到lib库和头文件啦,我在GameRes游戏开发资源网上找到了,只有3.2M,呵呵,够小吧。地址如下:
  DirectX9.0C SDK library
  下载下来解压后,假设解压到d:/codelib/dx9csdk下吧, 首先得把INC和lib目录加到VC的搜索路径上去。
  我用VS2005, 选择菜单Tools - Option - Projects and Solutions - VC++ Directories
  如图:
  


  然后,接下来就可以开始写代码了。
  我们采用Win32API来创建窗口,为了重用代码,创建窗口使用了我博客里介绍的一个类KWindow,请见:
  一个基于Win32的完全面向对象的窗口类
  我们新建一个类,叫做KD3DWindow把,从KWindow继承。
  其UML图如下所示:



  KWindow的内容请看我博客上的前一篇文章吧。
  KD3DWindow.h的内容如下所示:
#include "KWindow.h"
#include <D3D8.H>
#pragma comment(lib, "D3d8.lib")   //链接库

class KD3DWindow : public KWindow
{
private:
    void OnKeyDown(WPARAM wParam, LPARAM lParam);
    void OnDraw(HDC hDC);
    void GetWndClassEx(WNDCLASSEX & wc);
    
    //D3D相关
    void Render();
    void Cleanup();
    HRESULT InitD3D( HWND hWnd );
public:   
    KD3DWindow();
    ~KD3DWindow();
       virtual bool CreateEx(DWORD dwExStyle,
        LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
        int x, int y, int nWidth, int nHeight, HWND hParent,
        HMENU hMenu, HINSTANCE hInst);
private:
    LPDIRECT3D8             g_pD3D      ; // 用来创建D3D设备
    LPDIRECT3DDEVICE8       g_pd3dDevice ; // D3D设备
};
  KD3DWindow.cpp内容如下:
// KD3DWindow.cpp: implementation of the KD3DWindow class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "KD3DWindow.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <assert.h>
#include <tchar.h>
#include "KWindow.h"
const TCHAR szHint[]    = _T("Press ESC to quit.");
void KD3DWindow::GetWndClassEx( WNDCLASSEX & wc )
{
    memset(& wc, 0, sizeof(wc));
    
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WindowProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = NULL;
    wc.hIcon         = NULL;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = NULL;
    wc.hIconSm       = NULL;
}
void KD3DWindow::OnDraw( HDC hDC )
{
    //先用D3D设备渲染
    Render();
    //用Windows API在屏幕上绘图
    TextOut(hDC, 0, 0, szHint, lstrlen(szHint));
}
void KD3DWindow::OnKeyDown( WPARAM wParam, LPARAM lParam )
{
    if (wParam==VK_ESCAPE )
    {
        PostMessage(m_hWnd, WM_CLOSE, 0, 0);
    }
}
// 初始化D3D
HRESULT KD3DWindow::InitD3D( HWND hWnd )
{
    //如果还没有窗口,返回失败啦
    if( m_hWnd == NULL)
        return E_FAIL;
    // 创建D3D对象
    if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
        return E_FAIL;
    // 获取当前的显示模式
    D3DDISPLAYMODE d3ddm;
    if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
        return E_FAIL;
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;              // 窗口模式
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;   // 设置交换模式
    d3dpp.BackBufferFormat = d3ddm.Format;      // 设置背景缓冲区格式为当前左面格式
    // 创建D3D设备
    // 第一个参数:使用默认的显卡
    // 第二个参数:请求使用硬件抽象层(HAL)
    // 第三个参数:窗口句柄
    // 第四个参数:使用软件处理顶点
    // 第五个参数:创建的参数
    // 第六个参数:创建的D3D设备指针
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, 
                      D3DDEVTYPE_HAL, 
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp, 
                      &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }
    return S_OK;
}
// 释放D3D
void KD3DWindow::Cleanup()
{
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();
    if( g_pD3D != NULL)
        g_pD3D->Release();
}
// 渲染
void KD3DWindow::Render()
{
    if( NULL == g_pd3dDevice )
        return;
    // 清除背景为兰色
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
    // 绘制场景
    g_pd3dDevice->BeginScene();
    // 这里绘制你需要的东西
    // 结束绘制
    g_pd3dDevice->EndScene();
    // 显示到屏幕上
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
KD3DWindow::KD3DWindow()
{
}
KD3DWindow::~KD3DWindow()
{
    Cleanup();
}
bool KD3DWindow::CreateEx(DWORD dwExStyle,
        LPCTSTR lpszClass, LPCTSTR lpszName, DWORD dwStyle,
        int x, int y, int nWidth, int nHeight, HWND hParent,
        HMENU hMenu, HINSTANCE hInst)
{
    //创建窗口
    bool bRet = KWindow::CreateEx(dwExStyle,lpszClass,lpszName,dwStyle,x,y,nWidth,nHeight,hParent,hMenu,hInst);
    //初始化D3D设备
    if( InitD3D(m_hWnd) != S_OK)
        bRet = false;
    return bRet;
}
  代码关键地方都有注释,也很好理解的。
  然后就是主函数如何调用了,请看:
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    KD3DWindow win;
    //KHelloWindow win; 
    win.CreateEx(0, _T("Hello"), _T("Hello"), WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN)/4, GetSystemMetrics(SM_CYSCREEN)/4,
        GetSystemMetrics(SM_CXSCREEN)/2,
        GetSystemMetrics(SM_CYSCREEN)/2,
        NULL, NULL, hInstance);
    win.ShowWindow(nCmdShow);
    win.UpdateWindow();
    return win.MessageLoop();
}
  编译运行后,可以看到程序既有D3D渲染的背景场景,也有Win32 GDI绘制的文字。如下所示:



本文来自
http://blog.csdn.net/zxcred
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: