33 lines
1.1 KiB
GLSL
33 lines
1.1 KiB
GLSL
#version 330 core
|
|
#include "noise.glsl"
|
|
in vec2 vUv;
|
|
uniform vec3 uForward;
|
|
uniform vec3 uRight;
|
|
uniform vec3 uUp;
|
|
uniform float uAspect;
|
|
uniform float uTanHalfFov;
|
|
uniform int uLightCount;
|
|
uniform vec3 uStarDirections[2];
|
|
uniform vec3 uStarColors[2];
|
|
uniform float uStarAngles[2];
|
|
uniform float uTime;
|
|
out vec4 fragColor;
|
|
void main() {
|
|
vec2 xy=(vUv*2.0-1.0)*uTanHalfFov;
|
|
vec3 rd=normalize(uForward+uRight*xy.x*uAspect+uUp*xy.y);
|
|
float band=pow(max(0.0,1.0-abs(dot(rd,normalize(vec3(0.32,0.72,0.48))))),17.0);
|
|
float dust=smoothstep(-0.26,0.36,fbm(rd*8.0+vec3(4.1,9.2,3.4)));
|
|
vec3 color=vec3(0.00013,0.00020,0.00042)+vec3(0.0013,0.0016,0.0026)*band*dust;
|
|
for(int i=0;i<2;i++) {
|
|
if(i>=uLightCount) break;
|
|
float angle=acos(clamp(dot(rd,uStarDirections[i]),-1.0,1.0));
|
|
float r=angle/max(uStarAngles[i],0.00001);
|
|
float corona=exp(-max(0.0,r-1.0)*6.0)*0.12;
|
|
corona+=exp(-max(0.0,r-1.0)*1.5)*0.004;
|
|
corona+=0.0002*exp(-angle*28.0);
|
|
float strands=0.85+0.15*noise3(rd*18.0+uTime*0.015);
|
|
color+=uStarColors[i]*corona*strands;
|
|
}
|
|
fragColor=vec4(color,1.0);
|
|
}
|