GPU光线追踪
1.背景
此项目RayTracing的实现是基于OGL和ComputeShader的,计算的方法参考自Shirley的光线追踪教程,本文着重介绍在Compute Shader中如何编写Ray Tracing的计算过程。
2.ComputeShader简介
-
什么是Compute Shader?
Compute Shader 是GLSL着色器的一种,和Vertex和Fragment不同的是,CS是只有一级的管线,通过buffer(texture buffer、image buffer、SSBO)或者shared变量可以与CPU进行数据通信 -
Compute Shader特有的参数
计算着色器任务以组为单位,称为工作组Work Group,二级的单位称为本地工作组Local Workgroup,一级是Global Group; 例如location(local_size_x, local_size_y, local_size_z) 就是指的是本地工作组大小 -
Compute Shader的注意点
1)选择正确的工作组大小 2)使用内存屏障MemoryBarrier,防止乱序;在不同的请求之间插入控制流和内存屏障 3)使用共享变量 4)计算着色器在运行时,进行其他的任务工作
3.光线追踪代码
总的来说,简单的光线追踪器包括以下的部分:1. 光线的定义 2.物体位置及材质的定义 3.相交检测 4.递归计算光线。下面就从这些方面具体来看Compute Shader代码:
3.1光线的定义
光线可以表达为p(t) = A + t*B, 其中A为出发的位置,B为方向,t可以理解为时间。这样可以在C语言中定义出Ray结构体:
// Ray Class
struct Ray {
vec3 A; // 起点
vec3 B; // 方向
};
3.2 物体位置及材质
这里以圆形为例,定义圆心和半径:材质的逻辑是:将