探索DirectX Raytracing的魅力

探索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路径追踪器就只有几步之遥了!

许可证和开源软件

代码使用两个依赖库:

仓库包括测试渲染器使用的资产:

不要等待,现在就开始你的DirectX Raytracing旅程,体验下一代图形计算的魅力!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢忻含Norma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值