directx SDK (本文使用DX9.0)
安装visual studio 2017 ,可参考链接,请确保勾选c/c++桌面应用程序开发工具。
下载directx SDK,本文下载的是2010 June版本,已经默认集成了direct9/10/11 ,开发directx程序就够了。
学习DirectX开发,所需要的基本知识。1)c/c++编程知识,不需要精通,但需要经常实践,想写出一流的程序,需要长期不断的学习2)学习DirectX 3D开发还必须学习和掌握一些数学知识。 如,掌握向量几何和向量代数,以及它们在3D计算机图形学中的应用, 掌握矩阵,矩阵代数,以及如何借助矩阵进行3D几何变换,掌握用代数对平面和射线建模的方法,熟悉D3DX库中专门用于进行3D数学运算的部分类和函数。
使用Visual Studio VC++向导创建Window桌面工程。加入DirectX3D 头文件和库文件到工程中,在必要的地方加入Direct3D 初始化代码和渲染函数。一般是在创建windows窗口后初始化Direct3D,在消息循环中加入渲染绘制函数。
获取接口IDirect3D9的指针。该接口用于获取系统中物理硬件设备的信息并创建接口IDirect3DDevice9,该接口是一个C++对象,代表了我们用来显示3D图形的物理硬件设备。IDirect3D9* d3d9=0;d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
检查设备性能(D3DCAPS9),判断主显卡(primary display adapter 或primary graphics card)是否支持硬件顶点运算。为了创建接口IDirect3DDevice9,我们必须明确显卡是否支持该功能。D3DCAPS9 caps; d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps); int vp = 0; if (caps.DevCaps& D3DDEVCAPS_HWTRANSFORMANDLIGHT) { vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; } else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
初始化D3DPRESENT_PARAMETERS结构的一个实例。该结构由许多数据成员组成,我们可以通过这些变量来指定即将创建的接口IDirect3DDevice9的特性。D3DPRESENT_PARAMETERS d3dpp; d3dpp.BackBufferWidth = width; d3dpp.BackBufferHeight = height; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hwnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
利用已初始化的D3DPRESENT_PARAMETERS结构创建IDirect3DDevice9对象(一个C++对象,代表了我们用来显示3D图形的物理硬件设备)。HRESULT hr = d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, device); if (FAILED(hr)) { ::MessageBox(0, L'CreateDevice()-Failed', 0, 0); return false; }
添加渲染函数,所有的绘制方法都必须在IDirect3DDevice9::BeginScene 和IDirect3DDevicer9::EndScene构成的方法对之间进行调用,如_device->BeginScene(); _device->DrawPrimiteive(...);_device->EndScene(); 示例代码为:device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); device->BeginScene(); device->SetFVF(ColorVertex::FVF); device->SetStreamSource(0, triangle, 0, sizeof(ColorVertex)); D3DXMatrixTranslation(&world, -0.25f, 0.0f, 0.0f); device->SetTransform(D3DTS_WORLD, &world); device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); D3DXMatrixTranslation(&world, 0.25f, 0.0f, 0.0f); device->SetTransform(D3DTS_WORLD, &world); device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); device->EndScene(); device->Present(0, 0, 0, 0);