FishMan的技术专栏 Game Developer/Technical Artist

中级Shader教程13 星空渲染

2018-04-23
Jiepeng Tan

1.实现原理

1.使用球坐标来进行空间划分
2.对每个空间划分的grid产生hash
3.根据hashID 定义星星的大小,闪烁周期,明暗程度等
4.在grid绘制圆 用smoothstep 来控制圆的大小

2.源码

1.单层FBM中不同的层之间移动速度随时间的偏移

// 通过rd 来进行空间划分 这样在根据相机进行改变
float3 Stars(in float3 rd,float den,float tileNum)
{
    float3 c = float3(0.,0.,0.);
    float3 p = rd*tileNum;//空间划分
    float SIZE = 0.5;
    //分多层
    for (float i=0.;i<3.;i++)
    {
        float3 q = frac(p)-0.5;
        float3 id = floor(p);
        float2 rn = hash33(id).xy;

        float size = (hash13(id)*0.2+0.8)*SIZE; 
        float demp = pow(1.-size/SIZE,.8)*0.45;
        float val = (sin(_Time.y*31.*size)*demp+1.-demp) * size;
        float c2 = 1.-smoothstep(0.,val,length(q));//画圆
        //随机显示 随着深度的层数的增加添加更多的星星 增加每个grid 出现星星的概率
        c2 *= step(rn.x,(.0005+i*i*0.001)*den);
        c += c2*(lerp(float3(1.0,0.49,0.1),float3(0.75,0.9,1.),rn.y)*0.25+0.75);//不同的亮度
        p *= 1.4;//增加grid密度
    }
    return c*c*.7;
}

配套视频


Similar Posts

Comments