基本思想
从摄像机(ro)穿过屏幕上的每一个像素发射一条射线,返回遇到的第一个几何体表面的点到摄像机的距离,由此可以计算出这个点的三维坐标。
从模型上的该点向光源发射一条射线,配合表面法线计算出明暗程度,渲染到这个像素上。
函数一RayMarch
float RayMarch(vec3 ro,vec3 rd){
float dO = 0.;
for(int i=0; i<MAX_STEPS; i++){
vec3 p = ro+rd*dO;
float ds = GetDis(p);
dO+=ds;
if(dO>MAX_DIS || ds<MIN_DIS) break;
}
return dO;
}
函数的参数为摄像机的坐标,射线发射方向的单位向量,返回遇到的第一个点到ro的距离。
其中用到的GetDis()函数是输入某一点,返回这个点到空间内所有物体的距离中最小的一个。
不断选择离附近几何体中最短的距离递进,最为安全,直到迭代次数超过最大次数,表示该方向没有物体,或者距离物体距离比设置的最小距离都小,表示近似到达该点。
函数二 GetDis
float GetDis(vec3 p){
vec4 s=vec4(0.,1.,6.,1.);
float ds = length(p-s.xyz)-s.w;
float dp = p.y;
float d = min(ds,dp);
return d;