构建整体框架,暂时采用ppm图像输出(进度条学习moer-lite)、暂时不支持json导入
参考:moer-lite; ray-tracing series; moer; mitsuba; pbrt
- main
- ray
- camera
- pinhole
- thin lens
- light
- AreaLight
- EnvironmentLight
- SpotLight
- math(vec/matrix) 考虑其他库?
- glm库 (注意矩阵是列主序,length()函数返回的是向量的元素个数,不是长度)
- fastmath?
- transform
- TODO:包围盒部分
- [ ]
- shape
- 材质部分初始化
- Intersection
- sphere
- parallelogram(可用作地面和光源)
- 光源设置未完成
- 存在沿着平行四边形两边无限延长的问题,添加解决方法后边的长度不影响大小,只有边的方向起作用(改用自己的方法)
- triangle
- triangle mesh
- cube
- bounding box
- AABB
- acceleration
- BVH
- EmbreeBVH
- integrator
- 光线距离平方衰减
- normal (for testing)
- directIntegrator(环境光部分等待完善 —— environment map等)
- sampleBSDF(球那里有点实现上的问题 —— 已解决)
- sampleLight
- whittedIntegrator(不限制反射上限的话可能会进入死循环,看日志)
- pathIntegrator(蒙特卡洛积分器)
- 光强变大,需要HDR图片输出支持
- 目前仍有缺陷(有近似),带后续改进,详情见pathIntegrator.cpp
- BDPT
- sampler
- random
- IndependentSampler
- material
- Matte(对应Lambert)
- Mirror(direct integrator sample light那里的f直接返回0,看后续是否需要改进)
- Blinn_Phong
- conductor
- 目前roughness只使用了单一的float表示,后续改成vector2f,用于各向异性材料使用
- dielectric
- roughDielectric,当alpha较大时噪点较多,再考虑为什么
- BXDF
- sampling方法(返回wi和pdf)
- 均匀采样
- 重要性采样
- BXDF
- cosine权重采样(Lambert)
- brdf采样
- Specular
- Phong
- Conductor
- Dielectric
- roughDielectric,当alpha较大时噪点较多,再考虑为什么
- texture
- constantTexture
- imageTexture
- CheckerTexture
- normalTexture
- scene(目前使用的是std::vector<std::shared_ptr<Shape>> Shape_list 的Scene类)
- 加速结构(后续改进为该结构的Scene)
- BVH
- EmbreeBVH
- Octree
- 加速结构(后续改进为该结构的Scene)
- filter
- medium
- Json文件录入支持
- 导入模型
- 单个mesh模型导入+纹理
- 多个mesh的obj模型导入
- gltf格式场景导入
- 模型的mtl文件导入以及材质的设置
Mipmap相关事宜
TODO:Sphere的旋转(应该是在构造函数添加即可,不对,需要添加球的默认方向,Film,Blinn_Phong材质,Conductor/Dielectric(PBR),JPG/HDR图片写入(stb_image_write.h),动态模糊(在写好AABB+BVH后写),尝试导入gltf、fbx这种大场景模型,环境光(EnvironmentLight、InfiniteLight等),球体的scale来实现缩放,球的采样(rt series第三本中有)
图片写入:Image类,写入
Embree实现:intersection中直接添加primID,看是否可行;rayIntersectShape参数更改,uv的记录;triangle mesh的内部构造那边shapelist有问题(直接使用Shape中的默认getRTCGeometry方法)
再思考:是否可以直接用UserRayHit的intersection来接受相交信息?因为TriangleMesh似乎并不直接求交,而是声明了该几何体内部有哪些三角形