最简单的光线追踪
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 :为每个区域划分网格,如果射线经过该网格就计算该网格,而无需计算其他网格