Visual Studio为开发Direct3D应用程序提供了便捷的模版,读者可以不必手动去新建Direct3D中所使用到的基础资源,而只需专注于图形的绘制。本小节主要为读者介绍这个模版中用于绘制图形的主要函数及其功能,为了能让读者更为清楚地了解如何使用此模版绘制三维立体图形,下面的介绍将分为四部分,其中第一部分介绍在Visual Staudio 2012中如何新建Direct3D项目模版,第二部分介绍Direct3D项目模版中用于设置观察视点的函数和设置投影矩阵的函数,第三部分紧接着来介绍Direct3D项目模版中用于创建着色器和立体图形顶点的函数,最后一部分介绍Direct3D项目模版中用于绘制立体图形的函数。

(1)新建Direct3D项目模版

打开Visual Studio,单击"文件"菜单,在出现的下拉菜单栏中选择"新建项目",弹出"新建项目"窗口,并选择"Visual C++"菜单栏的"Windows应用商店"选项,接着选中"Direct3D应用程序",如图20-22所示。

图20-22 添加Direct3D项目模版

通过上述的步骤可以新建一个Direct3D应用程序项目作为开发Direct3D应用程序的模版,在这个项目中主要包含如下的文件:

  • BasicTimer.h头文件,在这个头文件中定义了一个作为计时器的BasicTimer类。
  • DirectXHelper.h头文件,在这个头文件中定义了用于处理异常和读取资源文件的函数。
  • CubeRenderer.h头文件,用于声明在CubeRenderer.cpp源文件中所使用的变量和函数。
  • Direct3Dbase.h头文件,用于声明在Direct3DBase.cpp源文件中所使用的变量和函数。
  • CubeRenderer.cpp源文件,在这个源文件中添加用于绘制立体图形的实现代码。
  • Direct3DBase.cpp源文件,在这个源文件中添加用于新建Direct3D资源的实现代码。
  • SimplePixelShader.hlsl文件,用于解析像素着色器的信息。
  • SimpleVertexShader.hlsl文件,用于解析顶点着色器的信息。

了解了如何在Visual Staudio 2012中新建一个用于开发Direct3D应用程序的模版以后,下面将介绍此模版中用于设置观察视点的函数和设置投影矩阵的函数。

(2)Update函数和CreateWindowSizeDependentResources函数

在介绍Update函数和CreateWindowSizeDependentResources函数之前,首先来介绍ModelViewProjectionConstantBuffer结构体,此结构体默认定义在CubeRenderer.h头文件中,代码如下所示:

struct ModelViewProjectionConstantBuffer

{

DirectX::XMFLOAT4X4 model;

DirectX::XMFLOAT4X4 view;

DirectX::XMFLOAT4X4 projection;

};

在ModelViewProjectionConstantBuffer结构体中定义了三个XMFLOAT4X4结构体的变量,分别是model、view和projection。其中model结构体变量用于表示立体图形的世界矩阵,view结构体变量用于表示立体图形的观察矩阵,projection结构体变量用于表示立体图形的投影矩阵。

CubeRenderer.cpp源文件的Update函数用于设置观察视点,此观察视点用来将三维立体图形呈现在应用窗口中。Update函数的实现代码如下所示:

void CubeRenderer::Update(float timeTotal, float timeDelta)

{

// 未使用的参数

(void) timeDelta;

//观察视点的位置,X=0.0,Y=0.7,Z=1.5,W=0.0

XMVECTOR eye = XMVectorSet(0.0f, 0.7f, 1.5f, 0.0f);

//观察目标的位置,X=0.0,Y=-0.1,Z=0.0,W=0.0

XMVECTOR at = XMVectorSet(0.0f, -0.1f, 0.0f, 0.0f);

//观察视点的向上向量,X=0.0,Y=1.0,Z=0.0,W=0.0

XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);

//设置观察视点

XMStoreFloat4x4(&m_constantBufferData.view, XMMatrixTranspose(XMMatrixLookAtRH(eye, at, up)));

//设置世界矩阵

XMStoreFloat4x4(&m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationY(timeTotal * XM_PIDIV4)));

}

在上面的代码中定义了三个XMVECTOR类型的变量eye、at和up,其中eye变量用于储存观察视点的位置,at变量用于储存观察目标的位置,up变量用于储存观察视点的向上向量。调用XMVectorSet函数将观察视点的位置设为{0.0f,0.7f,1.5f,0.0f },并将观察目标的位置设为{0.0f,-1.0f,0.0f,0.0f },接着将观察视点的向上向量设为{0.0f,1.0f,0.0f,0.0f}。接下来调用XMMatrixLookAtRH函数并使用eye变量、at变量和up变量作为参数得到一个矩阵,并以这个矩阵作为参数调用XMMatrixTranspose函数得到一个转置矩阵,接着调用XMStoreFloat4x4函数将此转置矩阵存储到view结构体变量中。

然后以参数timeTotal乘以XM_PIDIV4常量所得到的值作为参数调用XMMatrixRotationY 函数,得到一个绕Y轴的旋转矩阵,并以这个旋转矩阵作为参数调用XMMatrixTranspose函数得到一个转置矩阵,最后调用XMStoreFloat4x4函数将这个转置矩阵存储到model结构体变量中,使立体图形绕Y轴旋转。

CubeRenderer.cpp源文件的CreateWindowSizeDependentResources函数用于设置投影矩阵,此函数的实现代码如下所示:

void CubeRenderer::CreateWindowSizeDependentResources()

{

Direct3DBase::CreateWindowSizeDependentResources();

//定义aspectRatio变量

float aspectRatio = m_windowBounds.Width / m_windowBounds.Height;

//定义fovAngleY变量

float fovAngleY = 70.0f * XM_PI / 180.0f;

//设置投影矩阵

XMStoreFloat4x4(

&m_constantBufferData.projection,

XMMatrixTranspose(

XMMatrixMultiply(

XMMatrixPerspectiveFovRH(fovAngleY,

aspectRatio,

0.01f,

100.0f

),

XMLoadFloat4x4(&m_orientationTransform3D)

)

)

);

}

在上面的代码中,首先调用定义在Direct3DBase.cpp源文件中的CreateWindowSizeDependentResources函数来新建与应用窗口大小相关的资源。然后定义两个float类型的变量aspectRatio和fovAngleY,将应用窗口的宽度除以应用窗口的高度所得到的值赋给aspectRatio变量,并将70.0f乘以XM_PI常量再除以180.0f所得到的值赋给fovAngleY变量。接着以aspectRatio变量和fovAngleY变量作为参数调用XMMatrixPerspectiveFovRH函数来得到一个右手透视投影矩阵,使用XMMatrixMultiply函数将这个左手透视矩阵乘以XMLoadFloat4x4函数所返回的矩阵,得到一个新矩阵,并以这个新矩阵作为参数调用XMMatrixTranspose函数得到一个转置矩阵,最后调用XMStoreFloat4x4函数将这个转置矩阵存储到projection结构体变量中。

Win10系列:VC++ Direct3D模板介绍1相关推荐

  1. Win10系列:JavaScript 模板绑定

    WinJS库模板提供了一种格式化显示多条数据的便捷方式,通过这种方式可以将模板与ListView或FlipView等控件结合使用以控制数据的显示格式.定义一个WinJS库模板的方法与定义WinJS库控 ...

  2. 【MFC】VC++项目模板介绍

    00. 目录 文章目录 00. 目录 01. 概述 02. 常规模板 03. MFC模板 04. 附录 01. 概述 Visual Studio包含几种Visual C ++项目模板.这些模板有助于创 ...

  3. winr8文件服务器,技术讨论 | Windows全版本提权之Win10系列解析

    原标题:技术讨论 | Windows全版本提权之Win10系列解析 一. 背景介绍 2018 年 8 月 27 日,境外安全研究人员 SandboxEscaper 在其个人主页上披露了影响 Windo ...

  4. 大数据系列(一)之hadoop介绍及集群搭建

    大数据系列(一)之hadoop介绍及集群搭建 文章最早发布来源,来源本人原创初版,同一个作者: https://mp.weixin.qq.com/s/fKuKRrpmHrKtxlCPY9rEYg 系列 ...

  5. 【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程

    C++ 元模版编程:用std::integral_constant和std::is_*系列深入理解模板元编程 一.模板元编程与类型特性 (Template Metaprogramming and Ty ...

  6. 深度学习与计算机视觉系列(1)_基础介绍

    转载自: 深度学习与计算机视觉系列(1)_基础介绍 - 龙心尘 - 博客频道 - CSDN.NET http://blog.csdn.net/longxinchen_ml/article/detail ...

  7. openresty开发系列10--openresty的简单介绍及安装

    openresty开发系列10--openresty的简单介绍及安装 一.Nginx优点 十几年前,互联网没有这么火,软件外包开发,信息化建设,帮助企业做无纸化办公,收银系统,工厂erp,c/s架构偏 ...

  8. 搜索引擎ElasticSearchV5.4.2系列一之ES介绍

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x- ...

  9. html语言可以写模版继承吗,Django框架(十一):模板介绍、模板语言、模板继承、HTML转义...

    1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页 ...

最新文章

  1. SpringMVC+redis整合
  2. Nginx 日志中记录cookie
  3. 微服务发现组件Eureka:简介以及Eureka服务端开发
  4. Oracle为什么装在XP系统,重装xp系统后oracle恢复方法
  5. angularJS解决数据显示闪一下的问题?-解决办法
  6. 为什么不能同时用const和static修饰成员函数?
  7. 细述 Java垃圾回收机制→How Java Garbage Collection Works?
  8. 【转】cas注册后自动登录
  9. jdk自带4种多线程创建方式
  10. 计算机技术薄弱对我省影响,计算机技术在贵州省西南地区的运用前景.docx
  11. php使用redis消息队列swoole,swoole+Redis实现实时数据推送
  12. ++库 照片风格转换风格_婚纱照中式风格照片大全 2020年中式婚纱照怎么拍
  13. workman 心跳
  14. lena.bmp素材图像
  15. 谢晶:webpower中国区正在向“多渠道智能化营销”全面转型
  16. php全套之七,php程序员工具箱
  17. 【Go实战基础】程序里面数据是如何显示到浏览器当中的
  18. storm风暴英雄 tempo_【风暴英雄】锐派专区 - fb.replays.net | 风暴英雄官网合作中文站...
  19. 个人关于颈椎病治疗和保养的一些经验总结!
  20. android 8.1 9.0 10.0 Launcher3禁止拖拽app图标到第一屏

热门文章

  1. 架构师论坛 创业_我在早期创业时作为设计师学到的东西
  2. illustrator下载_Illustrator笔工具练习
  3. GitHub 支持上传视频文件啦!
  4. 我真的哭了,哭过后呢(-)
  5. 1.20(设计模式)模板模式
  6. Dubbo原理与框架设计
  7. SpringMVC执行流程图
  8. 话里话外:流程图绘制初级:六大常见错误
  9. java基础进阶(文件列表,线程,线程组)编程实例(4篇)
  10. 好用的shell工具_精选5个酷毙的Python工具