float hit(vec3 p){//判断光线是否击中物体的函数
//比如说我要画一个半径1000的圆
//直接写解析式就行了
return length(p.xz)<1000.0 ? 1.0:0.0;
}
float rayMarch(vec3 start,vec3 dir,int step,float stepLen){//dir要先normalize
if(dir.y<=0.0)//地平线以下
return 0.0;
vec3 nvec;//当前所在的坐标
float deltaHor = 20000.0 - dir.y; //20000是光线步进的起始平面
//计算起始点
if(deltaHor>0.0){//人在云层下
float stepDeltaHor = deltaHor/dir.y;
nvec = start+stepDeltaHor*dir;
}else{
nvec = start;
}
vec3 deltaStep = dir*(stepLen/dir.y);//每步走的距离
float count = 0.0;
//开始光线步进
for(int i=0;i<step;++i){
count += hit(nvec);
nvec += deltaStep;
}
return count;//最后返回的是光线穿过的厚度
}
cgoxopx
算法