光线追踪算法实现问题

最简单的光线追踪

compute(&rayOri,&rayDir);
for(i = 0 ; i != objects.size(); i++)
{
//找最近相交的物体
if(objects[i].interact(...)&&near > distance)
{
near = distance;
object = objects[i];
phit;
}
}
if(没有与任何物体相交)
return 环境颜色

compute(&pHit);
pHit.normalize();

//计算阴影射线
for(i = 0 ; i != lights.size(); i++)
{
shadowOri = pHit;
shadowDir = (lightPos - pHit).normalize();
if(阴影射线与其他物体相交)
该光线不产生作用
else
计算该光线产生的作用
}
返回颜色

注意点

  • 向量需要normalize
  • 一般计算阴影射线需要是pHit有偏移 pHit+normal*bias,这样就不会与发出射线的物体有交点

改进的光线追踪器

添加了折射和反射的影响(refraction和 reflection)

过程
1.计算射线与物体相交的最近的点
2.若物体可以折射或者可以反射且递归深度没有到达极限--解释:想法应该是可以反射的物体不一定可以折射,可以投射的物体必定可以折射
//几乎所有物体都能反射
2.1计算反射角度(RayDir - nHit * (2) * nHit *RayDir)
trace(反射射线)与不能反射的物体不同
2.2 如果物体可以折射
计算折射起始点 pHit - bias * nHit
方向有方程可以计算...
trace()
2.3综合两者的作用

3.或者只考虑漫反射(与之前计算阴影一样)

问题:1.如何增加清晰度
...增加像素点就可以
2.如何加快速度
...1.减少
...newPoint :为每个区域划分网格,如果射线经过该网格就计算该网格,而无需计算其他网格

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容