初学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. 解决 Visual Studio 2017 打开项目提示项目不兼容

    这应该算是VS2017的一个bug,昨天做好的.net core项目还能好好如初,今天打开就提示项目不兼容,未能加载...... 解决办法也是超级简单,但是往往越简单的办法越是想不到: 右键解决方案, ...

  2. 配置文件和mybatis文件存放位置导致系统启动不了

    1.web.xml <!-- 加载spring容器 --> <context-param> <param-name>contextConfigLocation< ...

  3. 第24章 QSPI—读写串行FLASH

    本章参考资料:<STM32F76xxx参考手册>.<STM32F76xxx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>及<S ...

  4. OSMboxPend()

    1. 原型:void   *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err) 2. 参数意义: pevent :消息邮箱 timeout ...

  5. vsCode中误删了文件,教你怎么恢复

      不要慌!下面开始帮你找到,很简单!

  6. JsonCpp在vs中使用

    Jsoncpp是c++生成和解析Json数据的跨平台开源库.下面简介如何在vs中使用. 1.官网下载.https://sourceforge.net/projects/jsoncpp/解压文件得到js ...

  7. JavaScript手绘风格的图形库RoughJS使用指南

    RoughJS是一个轻量级的JavaScript图形库(压缩后约9KB),可以让你在网页上绘制素描风格.手绘样式般的图形.RoughJS定义了绘制直线,曲线,圆弧,多边形,圆和椭圆的图元,同时它还支持 ...

  8. Linux入门——vsftpd

    vsftpd Introduction vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.特点是小巧轻快,安全易用. vsftpd 的名字代表"very secure FTP ...

  9. python学习笔记:第16天 面向对象02--对象中的成员

    目录 ⼀.类的成员介绍: 二.类的成员-变量 三.类的成员-方法 四.类的成员-属性 五.私有属性 ⼀.类的成员介绍: ⾸先, 什么是类的成员. 很简单. 我么能在类中写什么? 写的内容就是成员. 到 ...

  10. python3 package management 包管理 实例

    包是一种组织管理代码的方式,包里面存放的是模块 用于将模块包含在一起的文件夹就是包 包内包含__init__.py标志性文件 定义一个学生类,一个sayhello函数,一个打印语句 # p01.py ...