DirectX9:第一章 初始化Direct3D
一、Direct3D概述
Direct3D是一套底层图形API,可以被视为应用程序与图形设备交互的中介。
应用程序、Direct3D以及硬件之间的交互关系:
在Direct3D和图形设备之间有一个环节-HAL(Hardware Abstraction Layer,硬件抽象层)。
为什么要这个环节:由于市面上图形卡品种繁多,所以Direct3D无法与图形设备直接交互,Direct3D需要设备制造商实现一个HAL。HAL是一个指示 设备完成某些操作的设备相关的代码集。这样Direct3D就不必了解设备的具体细节,其规范的指定便可独立于具体的硬件。
设备制造商将其所支持的全部功能都实现到HAL中。那些Direct3D支持,但设备不支持的功能无法在HAL中实现。调用一个没有在HAL中实现的Direct3D函数会导致调用失败,除非它是一种顶点处理运算,并且用户已指定了使用软件顶点运算方式。在这种情况下用户所期望实现的功能便可由Direct3D运行时以软件运算方式来模拟。
REF设备
有时Direct3D提供的某些功能不被自己的图形设备支持,但仍希望使用这些功能,为了满足这种需求,Direct3D提供了参考光栅设备(reference rasterizer device),即REF设备,它能以软件运算方式完全支持Direct3D API。借助REF设备,可在代码中使用那些不为当前硬件所支持的特性,并对这些特性进行测试。
二、Direct3D的初始化
1.获取接口IDirect3D9的指针(该接口用于获取系统中物理硬件设备的信息并创建接口IDirect3DDevice9,该接口是一个c++对象,代表了我们用来显示3D图形的物理硬件设备。)
IDirect3D9 * _d3d9;
_d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
如果函数调用失败,会返回一个NULL指针。
IDirect3D9对象主要有两个用途:设备枚举以及创建IDirect3DDevice9类型的对象,设备枚举是指获取系统中可用的每块图形卡的性能、显示模式、格式以及其他信息。(比如为创建一种物理设备的IDrect3DDevice9类型的对象,我们需要知道物理设备所支持的显示模型和格式等配置信息,为了找到这样一种可行的配置,我们必须使用接口IDrect3D9的枚举方法)
2.检查设备性能(D3DCAPS9),判断主显卡是否支持硬件顶点运算。为了创建接口IDirect3DDevice9,我们必须明确显卡是否支持该功能。
//GetDeviceCaps参数介绍
HRESULT IDirect3D9::GetDeviceCaps{
UINT Adapter, //指定物理显卡序号
D3DDEVTYPE DeviceType, //指定设备类型(例如硬件设备(D3DDEVTYTPE_HAL)或软件设备(D3DDEVTYPE_REF))
D3DCAPS9 *pCaps //返回已初始化的设备性能结构实例
};
D3DCAPS9 caps;
d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
int vp = 0;
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; //硬件顶点运算
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //软件顶点运算
我们将顶点运算类型用变量vp保存供以后使用,这是因为在创建IDirect3DDevice类型的对象时,必须指定以后所要使用的顶点运算类型。
3.初始化D3DPRESENT_PARAMENTERS结构的一个实例。该结构由许多数据成员组成,我们可以通过这些变量来指定即将创建的接口IDirect3DDevice9的特性
typedef struct _D3DPERSENT_PARAMETERS_{
UINT BackBufferWidth; //后台缓存区宽度,单位为像素
UINT BackBufferHeight; //后台缓存区高度
D3DFORMAT BackBufferFormat; //后台缓存区像素格式(如32为像素格式:D3DFMT_A8R8G8B8)
UINT BackBufferCount; //后台缓存区个数,通常为1
D3DMULTISAMPLE_TYPE MultiSampleType; //后台缓存所使用的多重采样类型
DWORD MultiSampleQuality; //多重采样的质量水平
D3DSWAPEFFECT SwapEffect; //指定交换链中的缓存的页面置换方式。指定为D3DSWAPEFFECT_DISCARD时效率最高
HWND hDeviceWindow; //与设备相关的窗口句柄。制定了要进行绘制的应用程序窗口
BOOL Windowed; //全屏(false)或窗口(true)
BOOL EnableAutoDepthStencil; //设为true,则Direct3D自动创建并维护深度缓存或模板缓存
D3DfORMAT AutoDepthStencilFormat; //深度缓存或模板缓存的像素格式(用24为表示深度并将8位保留供模板缓存使用,D3DFMT_D24S8)
DWORD Flags; //其他的附加特性标志(通常指定为0或NULL)
UINT FullScren_RefreshRateInHz; //指定屏幕的刷新频率(默认为D3DPRESENT_RATE_DEFAULT)
UINT PresentationInterval; //D3DPRESENT集合的一个成员。其中两个成员较为常见(D3DPRESENT_INTERVAL_IMMEDIATE,D3DPRESENT_INTERVAL_DEFAULT)
}D3DPRESENT_PARAMETERS;
填充该结构的一个例子:
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = windowed;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
4.创建D3D设备类
利用已初始化的D3DPRESENT_PARAMENTER结构创建IDirect3DDevice9对象(代表了我们用来显示3D图形的物理硬件设施)
HRESULT IDirect3D9::CreateDevice{
UINT Adapter, //指定我们希望已创建的IDirect3DDevice9对象代表哪块物理显卡
D3DEVTYPE DeviceType, //制定需要使用的设备类型(如硬件设备D3DDEVTYPE_HAL或软件设备D3DDEVTYPE_REF)
HWND hFocusWindow, //与设备相关的窗口句柄。通常情况下是指设备所要进行绘制的目标窗口
DWIRD BehaviorFlags, //该参数可为D3DCREATE_HARDWARE_VERTEXPROCESSING 或 D3DCREATE_SOFTWARE_VERTEXPROCESSING
D3DPRESENT_PARAMENTERS *pPresentationParmeters, //一个已经完成初始化的D3DPRESENT_PARAMETERS类型的实例,该实例定义了设备的一些特性
IDirect3DDevice9** ppReturnedDeviceInterface //返回所创建的设备
};
函数调用示例:
hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device type
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
device); // return created device
if (FAILED(hr))
{
d3d9->Release(); // done with d3d9 object
::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
return false;
}
三、D3D样例完整运行流程
参考链接:https://www.cnblogs.com/k5bg/p/11088258.html
DirectX9:第一章 初始化Direct3D的更多相关文章
- DirectX9:基础篇 第一章 初始化Direct3D
一.简介 二.Direct3D类 1.创建D3D类 IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion); //Direct3D类的创建 IDirec ...
- 《DirectX 9.0 3D游戏开发编程基础》 第一章 初始化Direct3D 读书笔记
REF设备 参考光栅设备,他能以软件计算方式完全支持Direct3D Api.借助Ref设备,可以在代码中使用那些不为当前硬件所支持的特性,并对这此特性进行测试. D3DDEVTYPE 在程序代码中, ...
- OpenGL完全教程 第一章 初始化OpenGL
第一章 初始化OpenGL 无论是什么东西,要使用它,就必须对它进行初始化.如果你之前使用过GDI,你应该也多多少少了解到GDI在绘制图形之前要为之创建渲染环境.OpenGL也一样.本章给出的代码,大 ...
- QT5:第一章 初始化
一.简介 二.新建项目 在项目Application中: QT Widgets Application(桌面QT应用) QT Console Application(控制台QT应用) QT for P ...
- DirectX 9 UI三种设计学习笔记:文章4章Introducing DirectInput+文章5章Wrapping Direct3D
本文从哈利_创.转载请注明出处.有问题欢迎联系本人! 邮箱:2024958085@qq.com 上一期的地址: DX 9 UI设计学习笔记之二 第4章 Introducin ...
- DirectX12 3D 游戏开发与实战第一章内容
DirectX12 3D 第一章内容 学习目标 1.学习向量在几何学和数学中的表示方法 2.了解向量的运算定义以及它在几何学中的应用 3.熟悉DirectXMath库中与向量有关的类和方法 1.1 向 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数 学习目标: 学习如何使用几何学和数字描述 Vecto ...
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
- Nova PhoneGap框架 第一章 前言
Nova PhoneGap Framework诞生于2012年11月,从第一个版本的发布到现在,这个框架经历了多个项目的考验.一直以来我们也持续更新这个框架,使其不断完善.到现在,这个框架已比较稳定了 ...
随机推荐
- VMware安装出现"已将该虚拟机配置为使用 64 位客户机操作系统"
1.环境:ThinkPad电脑 系统:win10 64位.VMWare运行虚拟机发现提示无法执行64位操作. 2.解决办法: ⑴ 进入BOIS中 ⑵ 选择Security字段,进入Virtualiza ...
- 站内搜索(ELK)之数据目录
在使用elasticsearch建设站内搜索时,随着数据不断丰富,为了数据管理更加精细化,必须建立并实时维护“数据目录”(在程序设计中对应的叫法“数据字典”). 数据目录需要包含以下几个维度:数据名称 ...
- 死磕 java同步系列之mysql分布式锁
问题 (1)什么是分布式锁? (2)为什么需要分布式锁? (3)mysql如何实现分布式锁? (4)mysql分布式锁的优点和缺点? 简介 随着并发量的不断增加,单机的服务迟早要向多节点或者微服务进化 ...
- thymeleaf 语法
一.语法: 1. 简单表达式 (simple expressions) ${...} 变量表达式 *{...} 选择变量表达式 #{...} 消息表达式 @{...} 链接url表达式 2.字 ...
- F#周报2019年第40期
新闻 将项目成熟度重新考虑为一个社区过程 介绍.NET Core Windows Form设计器预览1 F# 4.7可以预览新语言特性与语法 视频及幻灯片 DotnetConf2019展示 .NET设 ...
- .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker
之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...
- setfacl、getfacl
当用户访问一个文件时,权限匹配的顺序为owner--->group--->other.当设置访问控制列表后,owner--->facl_user--->group---> ...
- vultr恢复快照后更改密码(CentOs7)
vultr恢复快照之后发现Xshell连不上了,仔细想想应该是之前换服务器的时候恢复快照导致密码更改了, 但是我已经把之前的服务器删了,没记住密码,这就很难受 只好改密码了 首先去官网 打开终端: 最 ...
- Spring Cloud 版本控制
### 正常版本 ``` org.springframework.boot spring-boot-starter-parent 2.1.7.RELEASE ``` ### SpringCloud 版 ...
- 由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
本文导读: 生产故障场景介绍 TCP 建连三次握手过程 TCP 断连四次挥手过程 结合 Java 堆栈剖析源码 再从堆栈中找到"罪魁祸首" 问题优化方案总结 1.生产故障场景介绍 ...