0x00 安装 Visual Studio 2019


安装 Visual Studio 2019 以及相关组件。

注:安装组件时带的 Windows 10 SDK 可以在 Individual components 中更换,这里更换为 10.0.19041.0。

0x01 新建工程


打开 Visual Studio 2019 并创建一个空项目,名字随意。

0x02 下载源码


源码下载地址:https://github.com/d3dcoder/d3d12book

下载完成后将整个 CommonChapter 6 Drawing in Direct3D\\Box 中的 ShadersBoxApp.cpp 复制到 0x02 步骤创建的项目中。

我的项目名为 dx12,拷贝后的文件结构如下(红色框中的是复制过来的文件):

0x03 构建项目


1.右键单击解决方案资源管理器的项目名称,在弹出的下拉菜单中依次选择 Add(添加) -> Existing Item(现有项),将文件 BoxApp.cpp 以及 Common 文件夹中的所有文件添加到项目中。添加后,解决方案资源管理器看起来应该和下图相同。

2.右键单击解决方案资源管理器的项目名称,在弹出的下拉菜单中选择 Properties(属性)。再从 Configuration Properties(配置属性) -> General(常规) 选项卡中,将 Windows SDK Version 设置为版本10.0.19041.0(0x01 安装的 Windows 10 SDK 版本)。

3.在主菜单中选择 Debug(调试) -> Start Debugging(开始调试)进行编译。

0x04 解决报错


点击开始调试后并没有成功运行项目,还有一些报错需要解决。

error C1083

首先是 BoxApp.cpp 中,遇到报错,无法打开源文件:

这一报错是由于我们创建的项目的文件结构与官方示例项目的文件结构有所不同。这里可以按照示例的文件结构来构建我们的项目,也可以修改这里的引用路径,使之符合我们的项目结构。我用的是第二种方法,修改后报错消失:

error C2664

error C2664: 'HANDLE CreateEventExW(LPSECURITY_ATTRIBUTES,LPCWSTR,DWORD,DWORD)': cannot convert argument 2 from 'bool' to 'LPCWSTR'

这里的报错位于 d3dApp.cpp 的 547 行,无法将 bool 转换为 LPCWSTR。这里可以将第二个参数修改为 nullptr来解决。

// 修改前
HANDLE eventHandle = CreateEventEx(nullptr, false, false, EVENT_ALL_ACCESS); // 修改后
HANDLE eventHandle = CreateEventEx(nullptr, nullptr, false, EVENT_ALL_ACCESS);

error LNK2019

error LNK2019: unresolved external symbol _main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)

这里的错误是因为,新建的空项目默认使用的是 main 函数作为入口,需要将它修改为符合示例项目的 WinMain

修改步骤如下:

  1. 右键单击解决方案资源管理器的项目名称,在弹出的下拉菜单中依次选择 Properties(属性)
  2. 依次选择 C/C++ -> Preprocessor -> Preprocessor Definitions,删除其中的 _CONSOLE 添加 _WINDOWS
  3. 依次选择 Linker -> System -> SubSystem,选择 Windows(/SUBSYSTEM:WINDOWS)

HR Failed

运行后,弹出错误提示窗:

hr failed in dx12\Common\d3dUtil.cpp; line 111; error: The system cannot find the path specified.

这里的错误是因为,Start Debugging 运行生成的 .exe 位于 Debug 文件夹下,不符合项目指定的 Shader 路径(位于 BoxApp.cpp 第 354 行):

mvsByteCode = d3dUtil::CompileShader(L"Shaders\\color.hlsl", nullptr, "VS", "vs_5_0");
mpsByteCode = d3dUtil::CompileShader(L"Shaders\\color.hlsl", nullptr, "PS", "ps_5_0");

打开项目目录,结构如下:

这里简单地将上面的路径修改一下即可:

// 修改后
mvsByteCode = d3dUtil::CompileShader(L"..\\Shaders\\color.hlsl", nullptr, "VS", "vs_5_0");
mpsByteCode = d3dUtil::CompileShader(L"..\\Shaders\\color.hlsl", nullptr, "PS", "ps_5_0");

0x05 最终运行


在解决了上面的错误之后,不出意外的话,再次点击 Start Debugging(开始调试) ,项目就应该可以成功运行 Box 演示程序了。

ps:示例按住鼠标左键可以旋转正方体,按住鼠标右键可以放大缩小正方体。

DX12龙书 00 - 环境配置:通过 Visual Studio 2019 运行示例项目的更多相关文章

  1. OpenGL 开发环境配置:Visual Studio 2017 + GLFW + GLEW

    Step1:Visual Studio 2017 Why 开发环境,后面编译GLFW 和 GLEW也要用 How 这里使用的是Visual Studio 2017的 Community 版本,直接官网 ...

  2. Visual Studio 2019新建Web项目

    选择创建新项目 选择ASP.NET Web 应用程序,下一步 填好相关信息,位置是保存项目的位置,点击创建 创建你需要的项目项,我们这里选择空项目,点击创建 添加文件 右击项目名 -> 添加 - ...

  3. 使用Visual Studio 2019开发Qt程序

    安装Qt 如标题,你首先需要到 http://download.qt.io/ 去下载并安装Qt,并在引导下安装MSVC组件(这里不做过多解释) Visual Studio 2019 配置 打开VS20 ...

  4. Windows 10 更新补丁后Visual Studio 2017 运行项目出现错误

    问题: 今天更新了Windows 10(版本 1709)推送最新补丁后,打开Visual Studio 2017运行Web项目,都出现“指定的参数超出有效值的范围 参数名:site”,如下图: 解决方 ...

  5. .net转PHP从零开始-配置visual studio 2013 PHP开发环境php for visual studio

    作为一个.net开发者,一直在visual studio这款强大的编辑器宠爱下,其他编辑器都不会用,也用着不熟练.最近这不是转php吗,使用php编辑器很不爽,觉得还是用visual studio舒服 ...

  6. Revit二次开发环境配置(Revit 2020 +Visual Studio 2019)

    Revit二次开发环境搭建(Revit 2019+Visual Studio 2017)准备内容 Revit 2019开发环境的搭建,需要安装的内容如下: Revit 2019(主要的开发环境) Vi ...

  7. python从零开始基础入门——开发环境搭建:Visual Studio Code

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:山海皆可平z PS:如有需要Python学习资料的小伙伴可以加点击下方 ...

  8. Apache Cordova开发环境搭建(一)-Visual Studio

    原文:Apache Cordova开发环境搭建(一)-Visual Studio 一.使用Visual Studio开发Apache Cordova手机App 1.版本要求,Visual Studio ...

  9. OpenCV(c++)-1 安装和配置OpenCV4.4(Windows+visual studio 2019)

    @ 目录 安装OpenCV4 在Windows系统安装OpenCV4 配置visual studio 2019 配置包含路径 验证配置结果 安装OpenCV4 OpenCV是一个基于BSD许可(开源) ...

随机推荐

  1. java中equals与hashCode的重写问题

    这几天有一个朋友问我在重写equals和hashCode上出现了问题,最后我帮她解决了问题,同时也整理出来分享给大家 现上Object的equals与HashCode的代码 public boolea ...

  2. 09vuex

    state 大白话:获取state的值 vuex中state数据是响应式的.只要state中数据发生变化.vue组件自动更新. 要想做到响应式 前提:是在mutaion中定义函数修改state值. 最 ...

  3. 持续部署入门:基于 Kubernetes 实现蓝绿发布

    前言 软件世界比以往任何时候都更快.为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验.越来越多企业已将其应用迁移到 Kubernetes. 在 Kubernetes 中有 ...

  4. 12_Python语法示例(函数)

    1.写一个函数mysum,此函数带有两个参数x,y打印出两个参数x,y的和 def mysum(x, y): print(x + y) mysum(3, 2) 2.写一个函数print_even,传入 ...

  5. 外包公司派遣到网易,上班地点网易大厦,转正后工资8k-10k,13薪,包三餐,值得去吗?

    作为一个人,我们必须时时刻刻清醒地看待自己,做到不卑不亢才能坚强地活下去. 请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/i ...

  6. ELK入门及基本使用

    预备知识-Restful 起源 在没有前后端分离概念之前,一个网站的完成总是“all in one”,在这个阶段,页面.数据.渲染全部在服务端完成,这样做的最大的弊端是后期维护,扩展极其痛苦,开发人员 ...

  7. MyBatis实现与插件开发

    分析源码之前也需要源码下载并安装到本地仓库和开发工具中,方便给代码添加注释:安装过程和mybatis源码的安装过程是一样的,这里就不再重复描述了:下载地址:https://github.com/myb ...

  8. [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)

    题目 203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 题解 删除结点:要注意虚拟头节点. 代码 class Solution { public ListNode removeEle ...

  9. NOIP2017 Day1 T1 小凯的疑惑

    题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品中,最贵的价 ...

  10. hystrix源码之插件

    HystrixPlugins 获取并发相关类(HystrixConcurrencyStrategy).事件通知类(HystrixEventNotifier).度量信息类(HystrixMetricsP ...