初学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. HDU 1016 Prime Ring Problem(素数环问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1016 Prime Ring Problem Time Limit: 4000/2000 MS (Jav ...

  2. java多线程注意事项

    1:继承thread和实现Runnable创建线程的区别: 继承thread创建的对象直接start()就可以就绪,但是使用Runnable所new出来的对象要先new Thread(xx)才能sta ...

  3. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  4. Knowledge Point 20180305 十进制转换成二进制浮点数

    如何将十进制的浮点数 转换二进制的浮点数,分为两部分: 1. 先将整数部分转换为二进制, 2. 将小数部分转换为二进制, 然后将整数部分与小数部分相加. 以 20.5 转换为例,20转换后变为1010 ...

  5. 在CentOS7上安装MySQL5.7-YUM源方式

    获取RPM包 # wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 列出RPM包里都有哪些文件 # ...

  6. 从技术上分析八叉网www.xxxxxxxxvideos.com的自动定时发布文章功能是怎么实现的

    做网站开发的都需要用到网站广告自动定时发布功能,也就是说,编辑在网站后台把文章编写好之后,设置发布时间,点确定后发布,这时在网站前台访客是看不到这篇文章的,必须要等到文章设置的发布时间之后才能看到.八 ...

  7. ssh登录等待时间超时问题的解决

    最近使用ssh登录服务器时,发现许多服务器会报告等待时间超时的错误,通过网上查找发现是由于ssh中的配置中开启了DNS反查的功能,导致在反查过程中消耗了很长的时间,现将解决方法总结如下: 使用root ...

  8. obfuscator-llvm Xcode集成配置

    一.简介 obfuscator-llvm 是一个开源的代码混淆编译器,能够使编译出来的文件添加垃圾代码和各种跳转流程,给逆向分析者增加难度. 二.编译 (1) 下载 目前最新版的是4.0的,下载地址是 ...

  9. 使用js实现单向绑定

    详细解释单向绑定 参考资料 MDN addEventListener()定义与用法 <!DOCTYPE html> <html lang="en"> < ...

  10. 用PHP读取Excel、CSV文件

    PHP读取excel.csv文件的库有很多,但用的比较多的有: PHPOffice/PHPExcel.PHPOffice/PhpSpreadsheet,现在PHPExcel已经不再维护了,最新的一次提 ...