开始学习DirectX,记录下一路的坑(win10+VS2017+DirectX11))

首先我搜到了不少大佬说,VS2017自带了DirectX你不需要搞那么繁复的配置(以前的DirectX+VS配置非常复杂)。 但我这个憨憨还是找不到自带的DirectX在哪里。。。

这个时候,八成是你安装VS2017时没有勾选正确的包。

打开这个【Visual Studio Installer】,就是回到你刚安装VS2017选包的那一步,怎么打开?

1. 可以从控制面板,进去找到VS,右键有卸载和修改。选修改

2. 新建项目时左下角有个直达电梯(入口),如下图


打开VS安装程序


ok,勾上两个


这个我本来就勾了


DirectX需要这个

这玩意写的也是有点让人头秃,我之前就勾过使用C++的游戏开发。。。你看他这介绍还写了,有DirectX.....

然后别人打开创建项目时可以找到DirectX11项目,我就找不到。。罪魁祸首就是没勾下面这个平台开发

咱看看平台开发右侧有什么??DirectX你怎么又出现在了这里。。。


这两个都勾上就可以再创建项目时找到DirectX了,11,12都有。。

打开直接run一下试试  ,我一下还没run成功。。报了一个错:

【由于错误800704C7 无法获取开发人员许可证】

弹出设置界面,选择开发人员模式即可


从默认的旁加载应用改成开发人员模式

wooooooo!!!!

后面的...我碰到之后,再慢慢更新啦~  


啊我觉得这个VS2017自带的框架真的真的很奇怪,和市面上所有DX11的教程都不同,而且感觉出入还挺大。本来还在犹豫要不要照着别的教程做算了,从空项目开始搞。但又觉得放着好端端的框架不用太浪费。

我还是努努力看懂这个框架吧....

网上说学过Opengl的人入手DirectX是分分钟的事,为什么我连个VS自带框架都看的似懂非懂o(╥﹏╥)o,我可太下饭了。下文是结合官方文档和VS自带框架,二者结合起来阅读的一些理解。


VS2017自带框架的组织结构:

框架代码的组织结构

为了画一个渐变色立方体旋转就这么多文件。。我以前学过opengl,我以为画立方体就搞8个点,在vertex shader里空间转换, fragment shader里上色就行了。转起来也不过就是对model加个与时间相关的旋转变换。可是这个框架里真的蛮多代码。菜鸡表示有点惶恐,只能选择细细的看看。。

这是入口,可以看出是new了一个对象(D3D应用),然后把它作为参数塞进了一个系统自带的Run函数。我用F12追进去看发现,Direct3DApplicationSource是继承自IframeWorkViewSource类的,但它有个需要重写的虚函数:CreateView()。就是说IframeWorkViewSource类的CreateView(),Direct3DApplicationSource类里的CreateView() 要覆盖替换掉基类的功能。

Direct3DApplicationSource  声明

让我们看看CreateView()是如何重写的,就在main函数的正下方

CreateView()重写

可以看出这个函数其实就是又返回了一个对象。是调用App类构造函数new出来的一个实例。行啊 再去看看App类的定义和其构造函数:

他这命名都很相似,一不留神就会看错。 所以现在整理一下:

App类是IFrameworkView的派生类,

Direct3DApplicationSource是IframeWorkViewSource的派生类

下面一行这个XXXsource的类只有一个Create()的功能,IframeWorkViewSource对应IFrameworkView,Direct3DApplicationSource对应App()

有没有点似曾相识的感觉?

这是不是很像个工厂模式。。

我发现 为什么我看不懂,是因为我不懂windows shell, 不理解IframeworkView到底是个什么接口。所以再追深一点看一下IframeworkView:

这是微软官方文档里关于IframeworkView的介绍

官方例子是教大家如何用IframeworkView实现一个简单的Direct3D view provider.

一个个看我们app类里的方法吧。

首先构造函数很简单:

构造函数就只设置了两个Private变量的值
Initialize里前三行都是调用的系统API

CoreApplicationView 是系统自带的一个类。

CoreApplication也是自带的。

Resuming和Suspending追进去看也是自带的。

这些就都感觉是比较底层的。最后一行m_deviceResources是个智能指针 shared_ptr,自此,app类里四个private的东西,就算有三个交代过了(构造函数里搞了两个,这里一个)。

Iniatialize已经看过了,就是处理底层接口外加赋值了一个shared_ptr(m_deviceResources)

再看load,搞了剩下的unique_ptr(m_main)

自此四个Private都赋值了

再整理一下:

App::app():设置了m_windowClosed(false),   m_windowVisible(true)

App::Initialize():设置了m_deviceResources = std::make_shared<DX::DeviceResources>();

App::load():设置m_main = std::unique_ptr<dxtest1Main>(new dxtest1Main(m_deviceResources));

dxtest1Main也是一个类。dxtest1就是我创建解决方案时的名字,等于说 Initiallize里是打通了硬件问题,然后将备好的硬件作为参数传进dxtest1Main的构造函数。dxtest1Main先不深入,免得枝叶散的太大了又搞不清了。

继续App类的其他函数:

App::Run()函数

可以看出App::Run()函数就是在window没有closed时,循环调用m_main的update(),m_main的Render(),Render()是准备呈现帧的作用,如果已经ready则返回true,随之调用m_deviceResources的Present(),这个Present()函数就是交换前后缓冲区的。这个知识点之前学习opengl的时候了解过,就是显示器有两个buffer,在幕后的buffer上先画好再刷新到台前,这样两个buffer前后交换可以减少绘制的卡顿。暂时也不深挖了知道是这个功能即可。

所以其实这个App::Run()就是游戏的经典大循环逻辑(如下),我是没写过游戏但也听说过orz:

while(不退出){

    update() 更新游戏逻辑,可能是处理输入或者加减血量修改数据之类的。

    render() 渲染画面

}

App还有几个方法:

刚说过的Run() Load() Initialize()都是IFramework自带的方法,App类里是以虚函数的形式重写了他们

还有两个Iframework自带方法:Setwindow()和Uninitialize()

Setwindow()是创建(或重新创建) CoreWindow 对象时调用,体感偏底层,最后也是和设备打交道。

Uninitialized()示例里面是空的

App还有几个新的方法:

生命周期处理程序OnActivated,OnSuspending,OnResuming

窗口事件处理程序OnWindowSizeChanged,OnVisibilityChanged,OnWindowClosed

===============

to be continue...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351