Win10系列:VC++ Direct3D模板介绍1

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结构体变量中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux+arch系统下载,Linux

大小: 695MB更新时间:2021-02-04适用电脑:系统盘大于20G超过1GMHz的处理器最佳64位处理器Arch Linux是一份独立开发的、为i686优化的Linux发行,它面向高级Linux用户。它使用自行开发的包管理器pacman来为最新的应用软件提供 更新升…

Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(…

C# 实例解释面向对象编程中的里氏替换原则

在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集,在他2000年的论文《设计原则与设计模式》中首次提出…

Android之error: void value not ignored as it ought to be(In function ‘callMethod2‘)解决办法

1、问题 chenyu@chenyu:~/Android_dev/Test/app/jni$ ndk-build [armeabi] Compile thumb : FirstJni <= JniClient.c /home/chenyu/Android_dev/Test/app/jni/JniClient.c: In function callMethod2: /home/chenyu/Android_dev/Test/app/jni/JniClient.c:74:18: error: vo…

JavaScript面向对象-静态方法-私有方法-公有方法-特权方法,学习

var baseClass function(){function show(){//私有方法alert("访问私有方法");}function showName(){alert(this.name);}this.showw function (){//特权方法showName();} } //静态方法 baseClass.showStatic function(){alert("访问静态方法"); }//公有方…

linux docker nginx,CentOS7上Docker简单安装及nginx部署

安装如果原来安装过docker&#xff0c;先把原来的删掉&#xff0c;再安装(如果是首次安装docker忽略第一步&#xff0c;直接在第二步看起)1.1先查看下已经安装了那些dockeryum list installed | grep docker查看结果docker.x86_64 2:1.13.1-94.gitb2f74b2.el7.centosdocker-cli…

linux下的常用命令

一、Linux、CentOS下重命名文件和文件夹 mv&#xff1a;move 用移动文件命令就可以了&#xff0c;因为linux系统没有专门的重命名命令。 基本格式&#xff1a; 移动文件&#xff1a;mv 文件名 移动目的地文件名 重命名文件&#xff1a;mv 文件名 修改后的文件名 示例&#xff1…

Android之JNI ERROR (app bug): accessed stale global reference 0xb39533f2 (index 19708 in a table of s

1、问题 2、原因 我在jni里面是这样写的 (*env)->CallVoidMethod(env, obj, method3, "chenyu"); 3、解决办法 把这个 (*env)->CallVoidMethod(env, obj, method3, "chenyu"); 改为这个 (*env)->CallVoidMethod(env, obj, method3, (*env)-&g…

Nim教程【十二】

排除指定符号 一般情况下使用import语句&#xff0c;会把一个模块内的符号都导入进来 如果你像排除特定的符号&#xff08;不想让某些符号被导入进来&#xff09; 可以使用except子句 就像下面这样 import mymodule except y 这行代码排除了mymodule模块中的y符号&#xff0c;其…

工业互联网的最后一公里

最后一公里&#xff0c;出自中国共产党十八大以来的新名词之一&#xff0c;指政策始终“走在路上”&#xff0c;服务始终“停在嘴上”&#xff0c;实惠没有真正“落在身上”的“末梢堵塞”问题。要让人民群众真正得实惠&#xff0c;就要切实解决好“最后一公里”问题。1、移动互…

Android 编程下设置 Activity 切换动画

为 Activity 设置切换动画 我们知道&#xff0c;我们可以在 AndroidManifest.xml 文件中&#xff0c;通过 android:theme 属性设置 Activity 的主题。主题中定义了关于 Activity 外观的很多特性。同时&#xff0c;主题中还可以定义 Activity 的切换动画。这是应用 Activity 切换…

Android之jni调用java函数总结

1、先看之前jni的如何实现动态注册 先看我之间的例子 http://blog.csdn.net/u011068702/article/details/71375920 Android之JNI动态注册native方法和JNI数据简单使用 因为这里演示的jni调用java函数是基于这个例子改的,然后还有如何在jni里面加上日志可以看这篇博客 http…

linux nfs 无法写入,无法写入挂载点(nfs-server),获得“权限被拒绝”

root_squash — Prevents root users connected remotely from having rootprivileges and assigns them the user ID for the user nfsnobody. Thiseffectively “squashes” the power of the remote root user to the lowestlocal user,preventing unauthorized alteration …

介绍这个库:C# Blazor中显示Markdown文件

1 讲目的 前几天上线了一个在线Icon转换工具[1]&#xff0c;为了让大家使用放心&#xff0c;改了点代码&#xff0c;在转换下载Icon图标后立即删除临时文件&#xff0c;并在工具下面贴上了工具的开发步骤和代码&#xff0c;大家看这样改是否合适&#xff0c;见Issue 1[2]。这篇…

Linux 信号量 生产者消费者小例题

菜鸟偶遇信号量&#xff0c;擦出火花&#xff08;只有不熟才会有火花&#xff09;。于是上网搜资料和看《Unix环境高级编程》实现了几个小例题&#xff0c;高手请勿喷&#xff01;这几位写得非常好啊&#xff1a; 题目来源&#xff1a; http://www.it165.net/os/html/201312/70…

Redhat 5.1 install PHP 5.3.6

Redhat 5.1 install PHP 5.3.6现在各种版本的坑。。导致没有低版本的php 可能是使用的问题导致。系统版本没有提升导致的没有包可用....yum install gcc libxml2-devel bzip2-devel zlib-devel \ curl-devel libmcrypt-devel libjpeg-devel \ libpng-devel gd-devel mysql-deve…

C/C++语言之通过定义指针函数方式来实现在一个cpp文件里面获取另外一个cpp文件函数的返回值

1、定义函数指针 typedef int (* fun) (); static fun f; 2、代码实现 3、结果 4、总结 我们可以这样使用 在a.h文件里面里面定义函数指针,并且有个传递函数指针的方法 typedef std::string (*fun)();void f2(fun f 1); 然后在a.cpp文件里面实现f2方法 static fun f;…

讀後感

看別人的故事&#xff0c;寫自己的故事&#xff0c;寫自己的感受。 在學習的過程中&#xff0c;其實會遇到很多的人、事、物&#xff0c;而處在我們這個階段的青年&#xff0c;往往是無知的。有些人或許還看不到自己前方的路是怎麼樣&#xff0c;在迷茫之中探索未來的些許星光&…

linux系统做的小游戏,2007最新 100个Linux系统上的小游戏汇集

希望了解Linux小游戏的朋友可以阅读下。给大家介绍一下&#xff0c;Linux下的小游戏&#xff0c;一共100个&#xff0c;有游戏的截图。有人说Linux缺乏娱乐性&#xff0c;其实不然&#xff01;在Linux下玩游戏要比Windows下表现力更好&#xff0c;Linux有非常多的小游戏&#x…

Dapr 中文社区汇总

Dapr 于 2019 年在微软创建。随着时间的推移&#xff0c;许多社区成员加入该项目并做出贡献&#xff0c;扩展并帮助它在 2021 年 2 月达到了稳定的 1.0 版本。2021年3 月提交给 CNCF&#xff0c;在2021年11月被接受 Dapr 作为 CNCF 的孵化项目。关于CNCF 的每个级别的成熟度要求…