cgoxpx's blog

SingingRivuletProject
Powered by TanTa

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
算法