DirectX9初步

1 VS2010+DirectX9.环境安装

Win7下下载DirectX9 SDK包,解压。

将需要的.lib文件添加到:C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib

将需要的.h头文件添加到:C:\Program Files\MicrosoftSDKs\Windows\v7.0A\Include

将DX包里面解压出来的需要的版本的.DLL防止到:C:\Windows\System32

用VS2010,建立一个空白的win32 Windows应用程序。如果是win32 控制台应用程序,需要到工程属性的连接-系统-子系统修改为windows就OK了。

2.Directx9 3D程序框架

主线:

(1)创建Direct3D接口

IDirect3D9

(2)由显卡显示模式,窗口显示属性参数来创建设备接口

D3DDISPLAYMODE

D3DPRESENT_PARAMETERS

IDirect3DDevice9 CreateDevice

(3)坐标系,图形数据的指定,创建顶点缓存(并将数据memcpy到顶点缓存)

D3DXMATRIX

D3DXMatrixOrthoLHh或D3DXMatrixPerspectiveFovLH

SetTransform/SetRenderState

stVertexData设置

CreateVertexBuffer

(4)坐标系的变换,设备接口对图形的渲染

BeginScene

/*//可选

D3DXMatrixTranslation

D3DXMatrixRotationY

SetTransform

*/

SetStreamSource

SetFVF

DrawPrimitive

EndScene

Present

(5)COM对象清理,Release减少内存引用计数。

3.注意

(1)MSG结构体和D3DPRESENT_PARAMETERS记得用ZeroMemory将其初始化,否则后续访问会出错。

 (2)每个函数要多查阅MSDN,多用才能在能力上面提高。

4.代码例子

//common.h

#include <d3d9.h>

#include <d3dx9.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")

LPDIRECT3D9 g_d3dInterface=NULL;

LPDIRECT3DDEVICE9 g_d3dDevice=NULL;

LPDIRECT3DVERTEXBUFFER9 g_vertexBuff=NULL;


D3DXMATRIX g_projectionMatrix;//D3DXMatrixPerspectiveFovLH立体投影坐标系统的设置
D3DXMATRIX g_translationMatrix;//D3DXMatrixTranslation
D3DXMATRIX g_rotationMatrix;//D3DXMatrixRotationY
D3DXMATRIX g_worldMatrix;

float g_angle=0.0f;

typedef struct tagD3DVertextData
{
    float x;
    float y;
    float z;
    unsigned long color;
};
#define D3DFVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)
#define WINDOWCLASS "worldclass"
#define TITLENAME "世界坐标系变换测试Demo"
#define WNDWIDTH 640
#define WNDHIGHT 480

bool InitializeD3D(HWND hwnd,bool fullscreen);
bool InitializeObjects();
void RenderScene();
void ShutDown();

//common.cpp

#include "common.h"
LRESULT WINAPI MsgProc(HWND wnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
    int virtual_code;
    switch(msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
        //break;
    case WM_KEYUP:
        virtual_code=(int)wparam;
        if(virtual_code==VK_ESCAPE)
        PostQuitMessage(0);
        return 0;
        //break;    
    }
    return DefWindowProc(wnd,msg,wparam,lparam);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
    HWND hwd;
    MSG msg;
    WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,NULL,NULL,
               GetModuleHandle(NULL),NULL,NULL,NULL,NULL,WINDOWCLASS,NULL};//GetModuleHandle(NULL)
    RegisterClassEx(&wc);
    HWND hWnd=CreateWindow(WINDOWCLASS,TITLENAME,WS_OVERLAPPEDWINDOW|WS_VISIBLE,100,100,WNDWIDTH,WNDHIGHT,
                              GetDesktopWindow(),NULL,wc.hInstance,NULL);
    
 if(InitializeD3D(hWnd,false))
 {
    ShowWindow(hWnd,SW_SHOWDEFAULT);
    UpdateWindow(hWnd);
    ZeroMemory(&msg,sizeof(msg));
    while(msg.message!=WM_QUIT)
    {
        if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            RenderScene();//渲染
        }
    }//end while
 }//end if
    //清理
    ShutDown();
    UnregisterClass(WINDOWCLASS,hInst);
    return 0;
}
bool InitializeD3D(HWND hwnd,bool fullscreen)
{
    D3DDISPLAYMODE displayMode;
    g_d3dInterface=Direct3DCreate9(D3D_SDK_VERSION);
    if(g_d3dInterface==NULL)
        return false;
    if(FAILED(g_d3dInterface->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
        return false;
    D3DPRESENT_PARAMETERS presentPram;
    ZeroMemory(&presentPram,sizeof(presentPram));
    if(fullscreen)
    {
        presentPram.Windowed=FALSE;//不是一个小窗口
        presentPram.BackBufferWidth=WNDWIDTH;//全屏是需要设置的窗口的宽度和长度
        presentPram.BackBufferHeight=WNDHIGHT;
    }
    else
    {
        presentPram.Windowed=TRUE;
    }
    presentPram.BackBufferFormat=displayMode.Format;
    presentPram.SwapEffect=D3DSWAPEFFECT_DISCARD;
   
    if(FAILED(g_d3dInterface->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&presentPram,&g_d3dDevice)))
    return false;

    if(!InitializeObjects())
        return false;
    return true;    
}
bool InitializeObjects()
{
    D3DXMatrixPerspectiveFovLH(&g_projectionMatrix,D3DX_PI/4,WNDWIDTH/WNDHIGHT,0.1f,1000.0f);
    g_d3dDevice->SetTransform(D3DTS_PROJECTION,&g_projectionMatrix);
    g_d3dDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
    g_d3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);

    tagD3DVertextData vertexData[]=
    {
        {-0.3f, -0.3f, 1.0f, D3DCOLOR_XRGB(255,255,0)},
        {0.3f, -0.3f, 1.0f, D3DCOLOR_XRGB(255,0,0)},
        {0.0f, 0.3f, 1.0f, D3DCOLOR_XRGB(0,0,255)}
    };
    if(FAILED(g_d3dDevice->CreateVertexBuffer(sizeof(tagD3DVertextData)*3,0,D3DFVF_XYZ|D3DFVF_DIFFUSE,D3DPOOL_DEFAULT,&g_vertexBuff,NULL)))
        return false;
    void *ptr=NULL;
    if(FAILED(g_vertexBuff->Lock(0,sizeof(vertexData),(void**)(&ptr),0)))
        return false;
    memcpy(ptr,vertexData,sizeof(vertexData));
    g_vertexBuff->Unlock();
    return true;
}
void RenderScene()
{
    g_d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
    g_d3dDevice->BeginScene();

    D3DXMatrixTranslation(&g_translationMatrix,0.0f,0.0f,7.0f);
    D3DXMatrixRotationY(&g_rotationMatrix,g_angle);
    g_worldMatrix=g_translationMatrix*g_rotationMatrix;
    g_angle+=0.02f;
    if(g_angle>360)g_angle=0.0f;
    g_d3dDevice->SetTransform(/*D3DTS_PROJECTION*/D3DTS_WORLD,&g_worldMatrix);

    g_d3dDevice->SetStreamSource(0,g_vertexBuff,0,sizeof(tagD3DVertextData));
    g_d3dDevice->SetFVF(D3DFVF);
    g_d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
    
    g_d3dDevice->EndScene();
    g_d3dDevice->Present(NULL,NULL,NULL,NULL);

}
void ShutDown()
{
    if(g_vertexBuff!=NULL)
        g_vertexBuff->Release();
    if(g_d3dDevice!=NULL)
        g_d3dDevice->Release();
    if(g_d3dInterface!=NULL)
        g_d3dInterface->Release();
    g_vertexBuff=NULL;
    g_d3dDevice=NULL;
    g_d3dInterface=NULL;    
}



    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DirectX 9 SDK安装包是用于开发DirectX 9应用程序和游戏的软件开发工具包。它包含了一系列的库、工具和文档,可以帮助开发人员创建基于DirectX 9技术的应用程序。 DirectX是一套由微软公司开发的多媒体编程接口,它提供了一系列的功能,包括图形渲染、音频处理、输入设备管理等。DirectX 9是DirectX中的一个版本,它于2002年发布,具有广泛的兼容性和功能。 SDK安装包中包含了一些重要的组件,比如Direct3D、DirectSound、DirectInput等。Direct3D是用于3D图形渲染的组件,它支持各种渲染效果和技术。DirectSound用于音频处理,可以实现3D音效和音乐播放等功能。DirectInput则用于处理输入设备,比如键盘、鼠标和游戏手柄等。 使用DirectX 9 SDK安装包,开发人员可以利用其提供的库和工具,快速开发出高性能的DirectX 9应用程序和游戏。它提供了丰富的文档和示例代码,帮助开发人员了解和学习DirectX 9的使用方法和技术。此外,SDK还提供一些辅助工具,比如调试器和性能分析器,方便开发人员进行代码调试和性能优化。 总之,DirectX 9 SDK安装包是一款强大的软件开发工具包,适用于开发DirectX 9应用程序和游戏。它提供了丰富的功能和工具,帮助开发人员快速开发出高性能、丰富多彩的应用程序。 ### 回答2: DirectX 9 SDK是一个用于开发游戏和多媒体应用程序的软件开发工具包。它提供了一系列的工具和资源,帮助开发者创建与DirectX 9兼容的应用程序。 安装DirectX 9 SDK需要以下几个步骤: 首先,下载DirectX 9 SDK安装包。可以从Microsoft官方网站或其他可靠的软件下载网站获取最新的安装包。确保选择适合自己操作系统的版本。 然后,双击下载的安装包进行安装。安装程序会打开一个向导,根据提示逐步进行安装。可以选择安装目录和其他选项,也可以接受默认设置直接点击下一步。 安装过程中可能会提示安装一些必要的系统组件,如.NET Framework等。按照提示同意安装这些组件,以确保DirectX 9 SDK正常工作。 安装完成后,可以在开始菜单中找到DirectX 9 SDK的相关工具和示例程序。这些工具包括DirectX 9的开发文档、开发工具、示例代码等,可以帮助开发者更好地理解和使用DirectX 9。 值得注意的是,DirectX 9 SDK已不再接受更新和支持,因此它可能不适用于最新的操作系统和硬件。如果需要开发DirectX应用程序,建议使用更新的DirectX版本或其他替代工具包。 总之,安装DirectX 9 SDK是一个相对简单的过程,只需下载安装包,按照安装向导进行操作即可。安装后,开发者可以使用DirectX 9 SDK提供的工具和资源进行游戏和多媒体应用程序的开发。 ### 回答3: DirectX 9 SDK 是微软开发的一个软件开发工具包,用于帮助开发者创建游戏、多媒体应用程序和图形应用程序。它包含了一系列的API(应用程序接口),用于处理图形、声音、输入设备和网络通信等问题。 安装DirectX 9 SDK 时,首先需要下载安装包。安装包一般提供在微软官方网站上,可以通过搜索引擎查找到官方下载链接。 下载完成后,双击安装包进行安装。安装过程中,用户需要同意软件许可协议,并选择安装路径。 安装完成后,可以在安装路径中找到 DirectX 9 SDK 的安装目录。在该目录下,可以找到一些开发工具、示例代码和文档等资源。 开发者可以利用这些资源来学习和开发相关应用程序。例如,他们可以使用示例代码作为参考来编写自己的程序,或者阅读文档了解API的使用方法和功能。 DirectX 9 SDK 还提供了一些工具来测试和调试应用程序。开发者可以使用这些工具来检测和修复错误,以确保应用程序的稳定运行。 总之,DirectX 9 SDK 是一个强大的开发工具包,可以帮助开发者创建高性能的游戏、多媒体和图形应用程序。通过安装和使用这个SDK,开发者可以更加方便地进行应用程序的开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值