Direct3D初始化

简单的Direct3D初始化步骤:

  1 /*
  2 2015.4
  3 Direct3D初始化
  4 */
  5
  6 #include <d3d9.h>
  7
  8 #pragma comment(lib,"d3d9.lib")
  9 #pragma comment(lib,"d3dx9.lib")
 10
 11 #define WINDOW_WIDTH    800
 12 #define WINDOW_HEIGHT    600
 13 #define WINDOW_TITLE    L"Direct3D初始化"
 14 #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }   //安全释放宏,便于后面COM接口指针的释放
 15
 16 LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; //Direct3D设备对象
 17
 18 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
 19
 20 //Direct3D的初始化
 21 HRESULT    Direct3D_Init(HWND hwnd);
 22
 23 //要绘制的物体的资源初始化
 24 HRESULT    Objects_Init(HWND hwnd);
 25
 26 //Direct3D渲染
 27 VOID Direct3D_Render(HWND hwnd);
 28
 29 VOID Direct3D_CleanUp();
 30
 31 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
 32 {
 33     WNDCLASSEX wndClass = { 0 };
 34     wndClass.cbSize = sizeof(WNDCLASSEX);
 35     wndClass.style = CS_HREDRAW | CS_VREDRAW;
 36     wndClass.lpfnWndProc = WndProc;
 37     wndClass.cbClsExtra = 0;
 38     wndClass.cbWndExtra = 0;
 39     wndClass.hInstance = hInstance;
 40     wndClass.hIcon = 0;
 41     wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
 42     wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
 43     wndClass.lpszMenuName = NULL;
 44     wndClass.lpszClassName = L"Game Develop";
 45
 46     if (!RegisterClassEx(&wndClass))
 47         return -1;
 48
 49     HWND hwnd = CreateWindow(L"Game Develop", WINDOW_TITLE,
 50         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH,
 51         WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
 52
 53     //Direct3D资源的初始化,成功或者失败都用messagebox予以显示
 54     if (S_OK == Direct3D_Init(hwnd))
 55     {
 56         MessageBox(hwnd, L"Direct3D初始化完成~!", L"消息窗口", 0);
 57     }
 58     else
 59     {
 60         MessageBox(hwnd, L"Direct3D初始化失败~!", L"消息窗口", 0);
 61     }
 62
 63     MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);
 64     ShowWindow(hwnd, nShowCmd);
 65     UpdateWindow(hwnd);
 66
 67     MSG msg = { 0 };
 68     while (msg.message != WM_QUIT)
 69     {
 70         if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
 71         {
 72             TranslateMessage(&msg);        //将虚拟键消息转换为字符消息
 73             DispatchMessage(&msg);        //该函数分发一个消息给窗口程序
 74         }
 75         else
 76         {
 77             //进行渲染
 78             Direct3D_Render(hwnd);
 79         }
 80     }
 81     //注销窗口类
 82     UnregisterClass(L"Game Develop", wndClass.hInstance);
 83     return 0;
 84 }
 85
 86 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 87 {
 88     switch (message)
 89     {
 90     case WM_PAINT:
 91         //调用Direct3D渲染函数
 92         Direct3D_Render(hwnd);
 93         // 更新客户区的显示
 94         ValidateRect(hwnd, NULL);
 95         break;
 96
 97     case WM_KEYDOWN:
 98         if (wParam == VK_ESCAPE)
 99             DestroyWindow(hwnd);
100         break;
101
102     case WM_DESTROY:
103         Direct3D_CleanUp();
104         PostQuitMessage(0);
105         break;
106
107     default:
108         return DefWindowProc(hwnd, message, wParam, lParam);
109     }
110
111     return 0;
112 }
113
114 HRESULT Direct3D_Init(HWND hwnd)
115 {
116     //Direct3D接口对象的创建
117     LPDIRECT3D9  pD3D = NULL;
118     //初始化Direct3D接口对象,并进行DirectX版本协商
119     if (NULL == (pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
120         return E_FAIL;
121
122     //获取硬件设备信息
123     D3DCAPS9 caps;
124     int vp = 0;
125     if (FAILED(pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps)))
126     {
127         return E_FAIL;
128     }
129     //支持硬件顶点运算,采用硬件顶点运算
130     if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
131         vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
132
133     //不支持硬件顶点运算,采用软件顶点运算
134     else
135         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
136
137     //填充D3DPRESENT_PARAMETERS结构体
138     D3DPRESENT_PARAMETERS d3dpp;
139     ZeroMemory(&d3dpp, sizeof(d3dpp));
140     d3dpp.BackBufferWidth = WINDOW_WIDTH;
141     d3dpp.BackBufferHeight = WINDOW_HEIGHT;
142     d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
143     d3dpp.BackBufferCount = 1;
144     d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
145     d3dpp.MultiSampleQuality = 0;
146     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
147     d3dpp.hDeviceWindow = hwnd;
148     d3dpp.Windowed = true;
149     d3dpp.EnableAutoDepthStencil = true;
150     d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
151     d3dpp.Flags = 0;
152     d3dpp.FullScreen_RefreshRateInHz = 0;
153     d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
154
155     //创建Direct3D设备接口
156     /*
157     HRESULT CreateDevice(
158                 UINT Adapter,
159                 D3DDEVTYPE DeviceType,
160                 HWND hFocusWindow,
161                 DWORD BehaviorFlags,
162                 D3DPRESENT_PARAMETERS *pPresentationParameters,
163                 IDirect3DDevice9** ppReturnedDeviceInterface);
164     */
165     if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
166         hwnd, vp, &d3dpp, &g_pd3dDevice)))
167         return E_FAIL;
168
169     //释放LPDIRECT3D9接口
170     SAFE_RELEASE(pD3D);
171
172     //渲染资源的初始化
173     if (!(S_OK == Objects_Init(hwnd)))
174         return E_FAIL;
175
176     return S_OK;
177 }
178
179 HRESULT Objects_Init(HWND hwnd)
180 {
181     return S_OK;
182 }
183
184 void Direct3D_Render(HWND hwnd)
185 {
186
187 }
188
189 void Direct3D_CleanUp()
190 {
191
192 }
时间: 2024-10-08 16:45:51

Direct3D初始化的相关文章

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——Direct3D中的顶点缓存和索引缓存

第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物体模型的基本单元,而一个三角形有3个顶点,为了能够使用大量三角形组成三角形网格来描述物体,需要首先定义号三角形的顶点(Vertex),3个顶点确定一个三角形,顶点除了定义每个顶点的坐标位置外,还还含有颜色等其他属性. 在Direct3D中,顶点的具体表现形式是顶点缓存,顶点缓存保存了顶点数据的内存空

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D编程基础

第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥的就不说了,直接进入正题,先来个典型的Direct3D程序框架图: 主要分为5个部分: 创建一个Windows窗口 Direct3D的初始化 消息循环 渲染图形 结束应用程序,清除在初始化阶段锁创建的COM对象,退出程序 至于COM (Component Object Model, 组件对象模型)

Direct3D-窗口初始化

这里讲的是创建一个通用的Direct3D窗口. 这里我先讲下用到的所有函数和结构 Window  WNDCLASSEX [cpp] view plaincopy typedef struct tagWNDCLASSEXA { UINT        cbSize; UINT        style; WNDPROC     lpfnWndProc; int         cbClsExtra; int         cbWndExtra; HINSTANCE   hInstance; HI

01 DirectX11初始化

由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且Direct SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了结合两者的代码,并做进一部简化处理. 项目源码点此 链接静态库 这里的每一个项目都需要包含静态库:d3d11.lib,dxgi.lib,dxguid.lib,D3DCompiler.lib和winmm.lib.可以用下面语句: #pragma comment(lib, "d3d11.lib") #pragma comment

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记7——四大变换

第13章 世界变换,取景变换,投影变换,视口变换 在Direct3D中,如果为进行任何空间坐标变换而直接绘图的话,图形将始终处于应用程序窗口的中心位置,默认这个位置就成为世界坐标系的原点(0,0,0).而且我们也不能改变观察图形的视角方向.默认情况下的观察方向是世界坐标系的z轴正向方向. 世界变换运算是为了能在世界空间中的指定位置来绘制图形 取景变换运算是为了以不同的视角观察图形 投影变换为了将相对较远的图形投影到同一个平面上并体现出"近大远小"的真实视觉效果 视口变换是为了控制显示图

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记8——载入三维模型&amp;Alpha混合技术&amp;深度测试与Z缓存

第17章 三维游戏模型的载入 主要是如何从3ds max中导出.X文件,以及如何从X文件加载三维模型到DirextX游戏程序里.因为复杂的3D物体,要用代码去实现,那太反人类了,所以我们需要一些建模软件. 对于3ds max,要到出.X文件,要装个Panda插件.然后就是作者推荐的一个3D模型资源网站:http://www.cgmodel.com/. 网格模型接口ID3DXMesh 这个接口表示网格,继承自ID3DXBaseMesh.ID3DXMesh接口中的D3DXCreateMesh()可用

《DirectX 9.0 3D 游戏开发编程基础》学习笔记#2

很长一段时间没写了,现在补上 博主使用的DirectX SDK版本为June 2010,以下以此版本为例,记录龙书上第二部分第一章中初始化Direct3D的API. IDirect3D9指针获取,Direct3DCreate9函数原型: /* * DLL Function for creating a Direct3D9 object. This object supports * enumeration and allows the creation of Direct3DDevice9 ob

网格模型和X文件使用面面观(转)

在本篇文章中,我们一起详细探索了Direct3D网格相关的知识,对当前两款主流的三维建模软件(3DS Max和Maya)进行了介绍,了解了如何从3DS Max 中导出X文件,以及如何从X文件加载三维模型到DirectX游戏程序中.文章最后,我们依旧配了一个比较好玩的demo来让大家对本篇文章所学的知识融会贯通,最后提供了这个demo详细注释的源代码下载. 首先我们复习一个之前讲过的概念. 在计算机所描绘的3D世界中,所有的物体模型(如树木,人物,山峦)都是通过多边形网格来逼近表示的,就像这幅DO

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记8——光照与材质

第14章 绘制出质感的世界--光照与材质 1. 光照与光源 在Direct3D中的光源类型和光照类型是不同的两个概念,光照模型描述的是光线的反射特征,而光源类型主要强调的是能够产生这些光照模型的方式以及光线的位置,方向,强度等特征. 四大光照类型 环境光:基于整个自然界环境的整体亮度,称为环境光或者背景光,没有位置或者方向上的特征,只有一个颜色亮度值,不会衰减,在所有方向和所有物体表面上投射的环境光的数量是恒定不变的(有点像我们白天的自然光).在Direc3D中设置环境光可以直接使用setRen