#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); }