DirectX12(D3D12)基础教程(外篇二)——编译DirectXShaderCompiler库

本文主要是介绍DirectX12(D3D12)基础教程(外篇二)——编译DirectXShaderCompiler库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1、前言
  • 2、准备工作
  • 3、下载DirectXShaderCompiler源码
  • 4、编译DirectXShaderCompiler

1、前言

  功夫不负有心人,终于DirectXShaderCompiler库,也就是HLSL的编译器开源项目源码也被我编译通过了,这是个不小的成功!于是我就乘热打铁,把整个编译的过程记录下来,并完整的分享给大家。目前HLSL Shader 已经发展到最新的V6.6版本了,按微软的叫法就是sm6.6,又增加了很多新的光追Shader特性,所以有喜欢研究编译器以及Shader编译原理或工具的网友,就很有必要掌握最新的DirectXShaderCompiler的编译方法了(其它的同学可以直接绕道下载Release版编译好的压缩包解压使用)。

  整个DirectXShaderCompiler是基于LLVM项目分支构建的,LLVM项目是一个庞大的开源的跨多种平台的编译器后端自动化构建工具集,几乎可以支持目前所有各类CPU(x86、ARM、RISC、MIPS等)、GPU的机器码、中间码的生成。可以毫不夸张的说,如果再配合Flex+Bison+LLVM几乎就可以构建任何语言的跨任何硬件及操作系统平台的编译器了(当然有兴趣的话你可以自己设计自己的计算机语言!),这对于喜欢鼓捣编译原理以及编译器的同学来说简直就是来自上帝的福音(请原谅我已经热泪盈眶了)!关于这一块扩展的知识我就不多说了,Flex+Bison的基础应用以及标准C/C++语言的词法和语法文件都可以在我的博客中找到,我就不粘贴链接占篇幅了,大家可以直接到编译原理目录下查找。

  OK,下面我们就言归正传,进入DirectXShaderCompiler的自编译生成之旅!

2、准备工作

  首先,跟之前一篇文章一样,需要我们安装Git客户端工具,这个就不赘述了。

  其次需要安装Python3.x以上版本,这里需要注意的是Python2.x版和Python3.x是两个不同分支体系的版本,并不是向下兼容的关系,因此下载和安装时尤其要注意,现在需要的V3.x以上的版本。Python的下载地址:https://www.python.org/getit/。安装成功后,命令行输入:

python --version

图一

  当前官方最新的版本是v3.9.4,我系统中的是v3.9.0,也够用了。这里一样提醒大家的是Python基本应用方法也是现代程序员必须掌握的硬核技能之一!

  最后一样需要安装VS2019,前一篇文章中已经说过了,也就不再赘述了。重点提醒大家一定要安装VS2019的命令行工具(PowerShell工具)集。

3、下载DirectXShaderCompiler源码

  为了整个下载编译过程的丝滑顺畅,后续的操作请大家一定要在VS2019命令行工具“Developer Command Prompt for VS 2019”中运行命令,并且以管理员身份运行这个集成PowerShell命令行工具集,运行正确的话窗口标题显示如下:
在这里插入图片描述

  这里需要郑重提醒大家的是,请一定一定使用“Developer Command Prompt for VS 2019”集成命令行工具,而不要使用新升级版本的PowerShell7 等工具,这与前一个教程中使用的要求是完全不同的。新版本的PowerShell工具还不能很好的兼容DirectXShaderCompiler库中的命令行脚本。当然这是个问题,就看微软的那些“阿三”同行们什么时候纠正了。

  首先从命令行进入到自己的项目目录中,我的项目目录是“Projects_2021”。

  接着在“Developer Command Prompt for VS 2019”中运行Git命令下载DirectXShaderCompiler源码:

git clone https://github.com/microsoft/DirectXShaderCompiler.git

  因为这个库体积比较大直接从Github下载有些慢,所以也可以从Gitee的克隆地址下载:

git clone https://gitee.com/gamebaby_admin/DirectXShaderCompiler.git

  完成后,进入源码目录,同样使用Git命令查看分支并切换到最新的发布分支上:

D:\Projects_2021\DirectXShaderCompiler>git branch -a
* (HEAD detached at origin/master)masterremotes/origin/19h1-relremotes/origin/HEAD -> origin/masterremotes/origin/SecureHLSLProtoremotes/origin/doc-extensionremotes/origin/dxcapi-uuidremotes/origin/dxdiaremotes/origin/dxil-2017-06remotes/origin/dxil-2017-09remotes/origin/dxil-2017-10remotes/origin/dxil-2017-11remotes/origin/dxil-2017-12remotes/origin/dxil-2018-03-01remotes/origin/dxil-2018-05-21remotes/origin/dxil-2018-09-10remotes/origin/dxil-2018-1-30remotes/origin/dxil-2019-03-29remotes/origin/dxil-2019-05-16remotes/origin/experimentalremotes/origin/fix-pix-alloca-reg-write-indexremotes/origin/fix-undeclared-id-crashremotes/origin/hcttest-custom-binremotes/origin/hlsl-2021remotes/origin/masterremotes/origin/merge-dxil-1-5remotes/origin/pix-inst-numberingremotes/origin/release-1.4.1907remotes/origin/release-1.5.1909remotes/origin/release-1.5.1910remotes/origin/release-1.5.1911remotes/origin/release-1.5.2002remotes/origin/release-1.5.2003remotes/origin/release-1.5.2003.1remotes/origin/release-1.5.2005remotes/origin/release-1.5.2010remotes/origin/release-1.6.2012remotes/origin/release-1.6.2102remotes/origin/release-1.6.2104remotes/origin/rs5-patchedremotes/origin/version-2005D:\Projects_2021\DirectXShaderCompiler>git checkout  remotes/origin/release-1.6.2104
Previous HEAD position was 3be3d15fc [spirv] update SPIRV-Tools submodule (#3694)
HEAD is now at e09a454eb Merge pull request #3684 from tex3d/refactor-exectest-setup-on-releaseD:\Projects_2021\DirectXShaderCompiler>

4、编译DirectXShaderCompiler

  然后进入DirectXShaderCompiler源码目录:

cd DirectXShaderCompiler

  紧接着创建一个build目录,但不进入先,后面我们需要进入想象不到的目录:

mkdir build

  然后我们进入DirectXShaderCompiler下的\utils\hct目录:

cd utils 
cd hct

  这时我们的命令行目录如下:
在这里插入图片描述

  紧接着我们需要运行hct下的hctstart命令:

hctstart -x64 D:\Projects_2021\DirectXShaderCompiler D:\Projects_2021\DirectXShaderCompiler\build

  注意其中-x64是指生成64位版的DirectXShaderCompiler工具,第一个路径是指DirectXShaderCompiler的源码根目录,第二个路径就是最终生成的解决方案、项目、exe、dll、lib等文件的存放目录,也就是我们刚才创建的build子目录。当然高兴的话你可以随便建个目录放进去。

  这个命令运行完之后注意命令行当前目录会自动跳回DirectXShaderCompiler源码的根目录:
在这里插入图片描述

  然后最最重要的步骤到了,就是要安装TAEF库,这个库的安装是个非常蛋疼的事情,首先你需要安装Windows的 Windows 驱动程序开发工具包:

https://download.microsoft.com/download/c/f/8/cf80b955-d578-4635-825c-2801911f9d79/wdk/wdksetup.exe

  下载后运行Wdksetup.exe,建议安装选项选择下载到本地某个目录中,而不是选择边下载边安装,防止因过程中断网或出错造成系统中被安装一堆垃圾。这个安装过程我就不再贴图了。

  WDK安装完成后,回到“Developer Command Prompt for VS 2019”命令行工具,在DirectXShaderCompiler源码根目录下运行如下命令:

python -v utils\hct\hctgettaef.py  
#或者
python utils\hct\hctgettaef.py

  这个命令的执行就比较蛋疼了,没有任何进度提示,你所能做的就是默默的等待直到它自行结束,整个过程就像死机了一样,所以中途不要断网,不要关机,不要关闭命令行窗口,最好不要再动电脑,此时你可以去泡杯茶或咖啡,或者干脆去上厕所(我当时是点了根烟,开始手机上刷抖音)。由于这一步极度无聊,我就不贴图了。(友情提醒:这个之前,显卡驱动最好也更新到最新版,以防止发生意外!如果是不支持光追的显卡建议直接绕到了,不然我估计会出很多稀奇古怪的问题,导致整个编译过程受挫!)

  下面就是在“活过来”的“Developer Command Prompt for VS 2019”命令行工具中,依然在DirectXShaderCompiler源码根目录下运行(第一个命令是清理并检查,二次编译时非常有用):

hctcheckin 

或者直接运行:

hctbuild -vs2019

进行编译了。也可以输入下面的命令,查看更丰富的编译开关,编译出自己想要的DirectXShaderCompiler工具:

hctbuild -help

详细输出参考如下:

D:\Projects_2021\DirectXShaderCompiler>hctbuild -help
Builds HLSL solutions and the product and test binaries for the current
flavor and architecture.系统找不到指定的文件。-s   creates the projects only, without building-b   builds the existing project-alldef        adds optional projects to the default build-analyze       adds /analyze option-official      will generate official version for build-fv            fixes the resource version for release (utils\version\version.inc)
系统找不到指定的文件。-rel           builds release rather than debug-speak-up      enables audible build confirmation-no-parallel   disables parallel build-no-dxilconv   disables build of DXBC to DXIL converter and tools-vs2017        uses Visual Studio 2017 to build-vs2019        uses Visual Studio 2019 to buildcurrent BUILD_ARCH=x64.  Override with:-x86 targets an x86 build (aka. Win32)-x64 targets an x64 build (aka. Win64)-arm targets an ARM build-arm64 targets an ARM64 buildGenerator:-ninja   use Ninja as the generatorAppVeyor Support-Release builds release-Debug builds debugARM build support-tblgen sets path to x86 or x64 versions of clang-tblgen and llvm-tblgen toolsThe solution file is at D:\Projects_2021\DirectXShaderCompiler\build\LLVM.sln

  前两个命令的执行过程我也就不再贴图了,因为实在是太多源码编译了,如果所有步骤都顺利的话,你应该自己能够看到整个冗长的检测或编译的过程。最后生成好的DirectXShaderCompiler工具全部在“\DirectXShaderCompiler\build\Debug\bin”目录中:
在这里插入图片描述

lib文件则在“\DirectXShaderCompiler\build\Debug\lib“中:
在这里插入图片描述

  最后可以在你的项目中直接按主干教程中的教的,引用头文件库文件并使用函数的方式编译HLSL脚本,或者使用dxc.exe直接编译为GPU中间语言文件,再二次读入程序中运行。

这篇关于DirectX12(D3D12)基础教程(外篇二)——编译DirectXShaderCompiler库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/182365

相关文章

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

C++/《C/C++程序编译流程》

程序的基本流程如图:   1.预处理        预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理将所有的“#define”删除,并且展开所有的宏定义处理所有的条件编译指令,如:“#if”、“

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本 基于Ubuntu 16.04 LTS系统所用ROS版本为 Kinetic hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 1.安装依赖库 所需系统及依赖库 Ubuntu 16.04|ros-kinetic|Gazebo|gazebo_ros_pkgs|ge

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本

hector_quadrotor编译总结 | ubuntu 14.04 ros-indigo版本 基于Ubuntu 14.04 LTS系统所用ROS版本为 Indigo hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 备注:两种安装方式可选:install the binary packages | install the source files

编译和链接那点事下

http://www.0xffffff.org/?p=357 上回书我们说到了链接以前,今天我们来研究最后的链接问题。         链接这个话题延伸之后完全可以跑到九霄云外去,为了避免本文牵扯到过多的话题导致言之泛泛,我们先设定本文涉及的范围。我们今天讨论只链接进行的大致步骤及其规则、静态链接库与动态链接库的创建和使用这两大块的问题。至于可执行文件的加载、可执行文件的运行时