MY BLOG DIRECTORY:
YivanLee:专题概述及目录INTRODUCTION:
【1】 realtime raytracing overview
我们渲染一个东西需要一个渲染管线,渲染管线就是一系列操作把输入的数据渲染成最终的图片。最开始我们使用固定管线,然后再发展到可编程管线,其实还是相对固定的,我们只能控制整个渲染管线的一部分比如VS,PS,GS等,大部分流水线的逻辑都是焊死在硬件里的。来看下传统可编程管线:
把这些逻辑做在硬件里的一个考虑其实是为了加速,同理如果要做实时光线追踪,我们就需要有足够的速度,所以2018年的时候英伟达那帮人推出了比较民用的RTX显卡,把光线追踪的逻辑焊死到显卡里,我们开发者能做的就只能是使用他们暴露出来的接口来编写我们的东西。优点就是速度快,缺点也很明显,自由度低,如果想要改什么功能需要硬件支持,需要微软的DX支持。这次在API层面对DX12的改进,主要是加入了一个全新的管线专门执行光线追踪的任务。以后让GPU发起任务的方式除了现有的光栅化渲染,和通用计算(CS)以外,还新加入了一个追踪光线的调用。新的光线追踪管线如下:
把上面红框框起来的的步骤展开,场景和光线的交互这步可以被分为以下阶段:
上述的所有过程都是固定的,我们可以控制的部分为蓝色线框框起来的部分。
整条管线的具体组成单元:
发起光线:
新D3D函数: ID3D12CommandList::DispatchRays()
新Shader类型:Ray Generation Shader
新HLSL函数:TraceRay()
Ray Generation Shader:定义一条光线如何产生,开始整个光线追踪过程。一个pass只执行一次。
光线的遍历与求交
遍历加速结构(Acceleration Structures)
新Shader类型: Intersection Shader。Intersection Shader定义光线如何和物体交互。
交点处理
Hit Group : 由Closest Hit, Any Hit, Intersection三种Shader构成。都不是必须的Shader,可选择调用
Intersection Shader:用于自定义几何体与射线求交,三角形与射线求交无需使用(内置)通过调用ReportHit()报告交点,同时传递Attributes给Hit Shaders
Any Hit Shader:射线有任一交点时被触发(不保证触发顺序)