初学Direct X (1)


Direct3D设备用于访问视频卡的帧缓冲区,以及后台缓冲区。由于IDE是vs2013,默认安装了direct 9,只需要在使用头文件(1)并像使用库文件(2)即可

#include <d3d9.h>                ------------(1)
#pragma comment (lib,"d3d9.lib") ------------(2)

1. 关于Direct3D的接口

编写Direct3D程序的第一步,少不了Direct3D的接口变量和图形设备变量,前者的类型是LPDIRECT3D9,后者的类型是LPDIRECT3DDEVICE9,LP意为long pointer,也就是长指针类型,其中

typedef struct IDirect3D9 *LPDIRECT3D9 //LPDIRECT3D9 指向的是 IDirect3D9 *
typedef struct IDirect3DDevice9 *LPDIRECT3DDEVICE9 // LPDIRECT3DDEVICE9 指向的是IDirect3DDevice9 *

在开始的时候直接声明后设置NULL即可:

LPDIRECT3D9 d3d = NULL;
LPDIRECT3DDEVICE9 d3ddev = NULL;

初始化Direct3D:

d3d = Direct3DCreate9(D3D_SDK_VERSION);

创建Direct3D将要输出显示的设备:

d3d->CreateDevice(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS* pPresentationParameters, ------------ (3)
IDirect3DDevice9** ppReturnedDeviceInterface ------------ (4)
);

关于后两个参数:

(3):指定设备的参数,假定为d3dpp,这个参数可以自己设定,也可以有动态设置的成分

(4):设备对象,也就是d3ddev

至此,Direct3D初始化就完毕了,接下来整理一下指定设备的参数如何设置

2. 指定设备参数的设置

首先可以看到这个参数类型为D3DPRESENT_PARAMETERS:

typedef struct _D3DPRESENT_PARAMETERS_
{
UINT BackBufferWidth; // 后台缓冲区宽度
UINT BackBufferHeight; // 后台缓冲区高度
D3DFORMAT BackBufferFormat;//后台缓冲区格式
UINT BackBufferCount; // 后台缓冲区数量 D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; // 后台缓冲区的交换模式
HWND hDeviceWindow;
BOOL Windowed; // 是否窗口化
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags; /* FullScreen_RefreshRateInHz must be zero for Windowed mode */
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;

最后可以进行如下设置:

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp)); //在使用前将结构中的所有值清为零
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferWidth = SCREENW;
d3dpp.BackBufferHeight = SCREENH;
d3dpp.hDeviceWindow = hwnd;

另,也有一种灵活的设置方式,可以使得在任意的PC上运行:

// 用于动态获取屏幕信息
D3DDISPLAYMODE dm;
d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&dm); D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = dm.Format;//D3DFMT_X8R8G8B8
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferWidth = dm.Width;// SCREENW;
d3dpp.BackBufferHeight = dm.Height;// SCREENH;
d3dpp.hDeviceWindow = hwnd;

在我电脑上dm的值为:

Width	1366	unsigned int
Height 768 unsigned int
RefreshRate 60 unsigned int
Format D3DFMT_X8R8G8B8 (22) _D3DFORMAT

3. Game_run()

Direct3D设备创建之后,使用Clear函数来清除后台缓冲区为绿色,这样可以使得在对每一帧进行渲染之前将屏幕清空。

void Game_Run(HWND hwnd) {
if (!d3ddev) return;
//r g b
d3ddev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,255,0),1.0f,0);
if (d3ddev->BeginScene()) {
// do something
// stop rendering
d3ddev->EndScene();
d3ddev->Present(NULL,NULL,NULL,NULL);//在渲染完成后通过将后台缓冲区复制到视频内存的帧缓冲区中刷新屏幕
}
if (KEY_DOWN(VK_ESCAPE))
PostMessage(hwnd, WM_DESTROY, 0, 0);
}

4.Game_End()

void Game_End(HWND hwnd){
if (d3ddev){
d3ddev->Release();
d3ddev = NULL;
}
if (d3d){
d3d->Release();
d3d = NULL;
}
}

初学DirectX(1)的更多相关文章

  1. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  2. 初学c# -- 开始学directx

    这些天对directx有兴趣了,开始慢慢学,先学基础,找了好些资料,为毛都写的辣么长呢,学习精简下来就几行. 安装个directx sdk,在win10里面文件夹C:\Windows\Microsof ...

  3. DirectX 11---从空间变换来看3D场景如何转化到2D屏幕

    DirectX 11---从空间变换来看3D场景如何转化到2D屏幕 在看<Introduction to 3D Game Programming with DirectX 11>的时候,发 ...

  4. 初学Direct X(4)

    初学Direct X(4) 本文学着做出一个如下的小游戏 游戏方式是使用键盘控制红色的Bucket收集蓝色的炸弹 1.酝酿一下 现在我已经掌握: 将位图文件加载到内存 绘制位图到buckbuffer ...

  5. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  6. Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)

    经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...

  7. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  8. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. 视频(video)属性

    Figure 3视频相关的属性: 属性 值 描述  muted muted  定义音频的初始状态,目前仅支持muted.   crossorigin  空  定义当前视频是否是一个跨域的项目.  me ...

  2. AAAI 2016 paper阅读

    本篇文章调研一些感兴趣的AAAI 2016 papers.科研要多读paper!!! Learning to Generate Posters of Scientific Papers,Yuting ...

  3. Andorid进阶7—— Ant自动编译打包&发布 android项目

    http://www.cnblogs.com/tt_mc/p/3891546.html Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Ecl ...

  4. 【题解】洛谷P1351 [NOIP2014TG] 联合权值(树形结构+DFS)

    题目来源:洛谷P1351 思路 由题意可得图为一棵树 在一棵树上距离为2的两个点有两种情况 当前点与其爷爷 当前点的两个儿子 当情况为当前点与其爷爷时比较好操作 只需要在传递时不仅传递父亲 还传递爷爷 ...

  5. 【题解】洛谷P1032 [NOIP2002TG]字串变换(BFS+字符串)

    洛谷P1032:https://www.luogu.org/problemnew/show/P1032 思路 初看题目觉得挺简单的一道题 但是仔细想了一下发现实现代码挺麻烦的 而且2002年的毒瘤输入 ...

  6. HDU 2088 Box of Bricks(脑洞)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2088 Box of Bricks Time Limit: 1000/1000 MS (Java/Oth ...

  7. 关于swing界面label和button的动态设置文字

    在引入发送验证码功能后,想让button的文本动态变化,发现如下方法并不能做到: int limitSec=10; while(limitSec>0){ sendyzhm.setEnabled( ...

  8. Spring知识点小结(三)

    一.aop的简介 aop:面向切面编程    aop是一种思想,面向切面编程思想,Spring内部提供了组件对aop进行实现    aop是在运行期间使用动态代理技术实现的思想    aop是oop延 ...

  9. AtomicIntegerArray数组类型类

      前一篇文章学习了AtomicXXX基本数据类型类,可以为int,boolean或者reference类型,也就是单个元素的原子类.那么数组类型呢? 下面以AtomicIntegerArray为例进 ...

  10. mybatis使用*号查询数据丢失问题

    使用*号的SQL语句:select * from 表名 在开发过程中可能你会发现使用mybatis框架爱作为持久层时,写的SQL语句在工具里面查询数据是可以查到想要的数据的,但是在项目中会出现数据丢失 ...