初学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. Objective-C——消息、Category和Protocol

    转自:http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html 面向对象永远是个可以吐槽的话 ...

  2. java 编写小工具 尝试 学习(五)

    1.今天 学习 标签 的 控件 的使用 ,学习 视频教程 参考  :http://edu.51cto.com/lesson/id-17733.html 常用控件如下截图: import javax.s ...

  3. Razor

    什么是Razor 1.Razor是一种将基于服务器的代码添加到网页中的标记语法 2.Razor具有传统ASP.NET标记功能 3.Razor是一种服务器端的标记语法 4.Razor同时支持C#和VB ...

  4. 三、Hadoop 的 API

    1.环境搭建 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop- ...

  5. 使用dbca命令静默卸载数据库

    1)     help查询dbca的选项 su - oracledbca -help dbca [-silent | -progressOnly | -customCreate] {<comma ...

  6. iOS开发神器InjectionIII

    最近发现了一款适用于iOS开发的神器,希望可以和大家一起分享,同时自己也将有用的东西记录下来,没错就是InjectionIII! 先看一下使用流程: 1.在MAC的App Store里面搜索下载这个工 ...

  7. Javascript Code Style Guide

    本指南采用的Airbnb发布的基于ES5的JavaScript Code Style. ES5 英文版:https://github.com/airbnb/javascript/tree/es5-de ...

  8. Linux下抓取登陆用户密码神器mimipenguin

    windows下有Mimikatz,现在linux下有了mimipenguin,国外安全研究员huntergregal发布了工具mimipenguin,一款Linux下的密码抓取神器,弥补了Linux ...

  9. 2018 kali linux install tools

    1.VM setup https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html VMware-Wo ...

  10. sublime text3配置python开发环境(windows版)

    安装阶段: sublime text3的安装: 下载网址:https://www.sublimetext.com/ 下载完成后 ,点击安装即可. 安装Package Control: 点击 Tools ...