opengl光线追踪的程序_光线追踪CPU->GPU

75f43c148253792013210a9c1ed752f5.png

这个文章最早基于 @miccall 的那篇文章

miccall:光线追踪太慢不想等?用 openGL重现采样过程​zhuanlan.zhihu.com
620fac33bf446bf4b61f8d78f1864beb.png

真的,每次跑光线追踪即使很小的图都要等好几分钟,我甚至当渲染一张大图的时候要使用了腾讯云的便宜的学生机让它去跑,但是几次之后实在是忍不下去了,想着能不能用GPU帮助计算呢?

所以我也想来自己follow做一个,但是我跟了的OpenGL教程主要是基于GLFW和GLAD,也就是下面这个,所以我就想着重构 @miccall 的GLut这个比较老的框架,但是发现还是自己写一下更加方便?233

LearnOpenGL CN​learnopengl-cn.github.io

我的方法是使用计算着色器对光线追踪进行计算,然后用一个纹理进行存储结果(这部分需要OpenGL 4.3及以上的支持,所以只好选择了Win平台),理论上光线追踪的原理是逐像素进行光照的计算,所以计算在片元着色器中理论上是肯定可以的,但是限于我现在的水平吧,暂时没有搞出来......但是肯定是可行的,之前 @Ubp.a 大佬已经搞出来了

Ubp.a:基于OpenGL的GPU光线追踪​zhuanlan.zhihu.com
d09f494fc8b6b3e476594f8ca3e3000e.png

我也是在之前阅读了Peter ShirleyRay Tracing in One WeekendRay Tracing: the Next Week,我跟 @Ubp.a 的做法不同的是,他使用的是自己手动维护一个栈的方法来在glsl中代替递归,而我的做法是通过循环的方式:

struct 

其他部分基本上就是Peter Shirley的代码无痛改写glsl的形式,数据的传输和C系语言的指针是其中另一个难处理的地方,我在这里主要使用readonly buffer的方式,直接对object的信息进行比较粗暴的记录和结构体整合,然后再在着色器中按需进行运算:

//整个材质与纹理进行绑定

直接给效果吧,整体而言还算可以:(速度大概1s渲染1帧多一点吧)

daea38515b999f398a0d3b13b12876bb.png
https://www.zhihu.com/video/1089666823770742784

1000次帧之后效果如下:

5f8c30f577a12a67b18969875167fd67.png

代码将在这几天整理完之后在下面放出github链接,谢谢大家阅读,新手上路,还请多多指教

yu-cao/RayTrace​github.com
24e23f357e09ac59abde2a35125300c0.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值