这个文章最早基于 @miccall 的那篇文章
miccall:光线追踪太慢不想等?用 openGL重现采样过程zhuanlan.zhihu.com真的,每次跑光线追踪即使很小的图都要等好几分钟,我甚至当渲染一张大图的时候要使用了腾讯云的便宜的学生机让它去跑,但是几次之后实在是忍不下去了,想着能不能用GPU帮助计算呢?
所以我也想来自己follow做一个,但是我跟了的OpenGL教程主要是基于GLFW和GLAD,也就是下面这个,所以我就想着重构 @miccall 的GLut这个比较老的框架,但是发现还是自己写一下更加方便?233
LearnOpenGL CNlearnopengl-cn.github.io我的方法是使用计算着色器对光线追踪进行计算,然后用一个纹理进行存储结果(这部分需要OpenGL 4.3及以上的支持,所以只好选择了Win平台),理论上光线追踪的原理是逐像素进行光照的计算,所以计算在片元着色器中理论上是肯定可以的,但是限于我现在的水平吧,暂时没有搞出来......但是肯定是可行的,之前 @Ubp.a 大佬已经搞出来了
Ubp.a:基于OpenGL的GPU光线追踪zhuanlan.zhihu.com我也是在之前阅读了Peter Shirley的Ray Tracing in One Weekend和Ray Tracing: the Next Week,我跟 @Ubp.a 的做法不同的是,他使用的是自己手动维护一个栈的方法来在glsl中代替递归,而我的做法是通过循环的方式:
struct
其他部分基本上就是Peter Shirley的代码无痛改写glsl的形式,数据的传输和C系语言的指针是其中另一个难处理的地方,我在这里主要使用readonly buffer的方式,直接对object的信息进行比较粗暴的记录和结构体整合,然后再在着色器中按需进行运算:
//整个材质与纹理进行绑定
直接给效果吧,整体而言还算可以:(速度大概1s渲染1帧多一点吧)
1000次帧之后效果如下:
代码将在这几天整理完之后在下面放出github链接,谢谢大家阅读,新手上路,还请多多指教
yu-cao/RayTracegithub.com