探索DirectX Raytracing的魅力
这是一个基础版的DirectX Raytracing(DXR)应用程序,为你快速启动DXR开发之旅提供了一手资料。与其他教程不同的是,这个示例代码不会在DXR主机API之上创建或使用任何抽象层,而是专注于通过原始API调用来突出显示DXR的新特性和差异。
代码示例追踪主射线,并包括一个简单的hit着色器,该着色器采样纹理。以下是应用在发布模式下的输出效果:
必备条件
- Windows 10 v1809,"2018年10月更新"(RS5)或更高版本
- Windows 10 SDK v1809(10.0.17763.0)或更高版本。下载地址
- Visual Studio 2017, 2019 或者VS Code
代码结构
数据通过结构体在应用程序中传递。这些结构体定义在Structures.h
中,并分为三类:
- 全局
- 标准D3D12
- DXR
渲染代码位于Graphics.h/cpp
中,划分为四个命名空间,将新的DXR功能与现有的D3D12功能分离开来。
D3DResources
namespace D3DResources
{
void Create_Buffer(D3D12Global &d3d, D3D12BufferCreateInfo &info, ID3D12Resource** ppResource);
void Create_Texture(D3D12Global &d3d, D3D12Resources &resources, Material &material);
void Create_Vertex_Buffer(D3D12Global &d3d, D3D12Resources &resources, Model &model);
void Create_Index_Buffer(D3D12Global &d3d, D3D12Resources &resources, Model &model);
...
}
包含了创建D3D12资源的通用函数,如(顶点,索引,常量)缓冲区,纹理,采样器和堆。
D3DShaders
namespace D3DShaders
{
void Init_Shader_Compiler(D3D12ShaderCompilerInfo &shaderCompiler);
void Compile_Shader(D3D12ShaderCompilerInfo &compilerInfo, RtProgram &program);
...
}
包含用于初始化DX编译器以及加载和编译着色器(当然,也包括新的DXR光线跟踪着色器)的函数。
D3D12
namespace D3D12
{
void Create_Device(D3D12Global &d3d);
void Create_CommandList(D3D12Global &d3d);
...
}
包含了常见的D3D12设置操作函数,如设备,命令列表,命令队列,命令分配器,栅栏,交换链和根签名的创建。请注意,在使用DXR时,设备和命令列表的创建存在微小差异。
DXR
namespace DXR
{
void Create_Bottom_Level_AS(D3D12Global &d3d, DXRGlobal &dxr, D3D12Resources &resources, Model &model);
void Create_Top_Level_AS(D3D12Global &d3d, DXRGlobal &dxr, D3D12Resources &resources);
void Create_RayGen_Program(D3D12Global &d3d, DXRGlobal &dxr, D3D12ShaderCompilerInfo &shaderCompiler);
void Create_Miss_Program(D3D12Global &d3d, DXRGlobal &dxr, D3D12ShaderCompilerInfo &shaderCompiler);
void Create_Closest_Hit_Program(D3D12Global &d3d, DXRGlobal &dxr, D3D12ShaderCompilerInfo &shaderCompiler);
void Create_Pipeline_State_Object(D3D12Global &d3d, DXRGlobal &dxr);
void Create_Shader_Table(D3D12Global &d3d, DXRGlobal &dxr, D3D12Resources &resources);
...
}
包含了专属于DirectX Raytracing的新功能。这包括加速结构创建,着色器表创建和更新,光线跟踪管道状态对象(RTPSO)创建,以及光线跟踪着色器的加载和编译。
命令行参数
-width [integer]
指定渲染窗口的宽度(以像素为单位)-height [integer]
指定渲染窗口的高度(以像素为单位)-vsync [0|1]
指定是否启用垂直同步-model [path]
指定OBJ模型文件路径
推荐练习
在构建并运行代码后,首先建议您使用NVIDIA的Nsight Graphics项目文件(IntroToDXR.nsight-gfxproj)捕获应用运行的一个帧,以便清楚地看到应用如何工作。你可以在这里下载Nsight Graphics。
一旦对应用程序的工作原理有了很好的理解,我鼓励你深入研究DXR,移除现有代码的限制,并添加新的渲染特性。我建议:
- 通过每个像素发射多条射线来实现抗锯齿。
- 添加加载和渲染具有多个材质的模型(目前仅支持单个材质)
- 添加真实的照明和阴影(当前的光照是烘焙的!)
- 添加光线追踪阴影。额外加分:使用Any-Hit着色器进行阴影渲染
- 添加光线追踪环境闭塞。
- 对镜面材料添加反射效果。
- 将相机平移和旋转映射到键盘和鼠标输入。
如果你实现了上述特性,你离自己的DXR路径追踪器就只有几步之遥了!
- 实现《一周内掌握光线追踪》(购买链接)
许可证和开源软件
代码使用两个依赖库:
- TinyObjLoader,MIT许可。
- stb_image.h,MIT许可。
仓库包括测试渲染器使用的资产:
- 雕像图像,Michael Gaida作品,遵循CC0 1.0 Creative Commons Universal Public Domain Dedication License授权。
- 无与伦比的Magnarc电影院放映机,Miguel Bandera作品,遵循Creative Commons Attribution 4.0 International License授权。
不要等待,现在就开始你的DirectX Raytracing旅程,体验下一代图形计算的魅力!