mat2 Rot(float a) {
float s = sin(a), c = cos(a) ;
return mat2(c, -s, s, c) ;
}
float Star(vec2 uv, float flare) {
float d = length(uv) ;
float m = 0.02/d ;
m*= 2.0 ; // 블러빛 밝기
// 십자 레이
float rays = max(0.0, 1.0-abs(uv.x*uv.y*1000.0)) ;
m += rays * flare ;
// 대각선 레이
uv *= Rot(3.1415/4.0) ;
rays = max(0.0, 1.0-abs(uv.x*uv.y*1000.0)) ;
m += rays * 0.3 * flare ;
m *= smoothstep(1.0, 0.2, d) ;
// 무한하게 대각선 레이와 빛을 뿜지 않도록 마스크 적용한다. 1.0 -> 0, 0.2 -> 1
return m ;
}
float Hash21(vec2 p)
{
p = fract(p*vec2(123.34, 456.21) ) ;
p += dot(p, p+45.32) ;
return fract(p.x*p.y) ;
}
vec3 StarLayer(vec2 uv) {
vec3 col = vec3(0.0);
vec2 gv = fract(uv)-0.5 ; // -0.5~0.5 (중심 fract uv)
vec2 id = floor(uv) ;
for(int y=-1; y<=1; y++) {
for(int x=-1 ; x<=1; x++) {
vec2 offs = vec2(x, y) ; // -1, -1 >> -1, 0 ... 순으로 순차적으로 실행.
float n = Hash21(id+offs); // 루프 돌때마다 다른 랜덤
float size = fract(n*345.32) ; // 0~1의 구역별 랜덤
float star = Star(gv-offs-vec2(n, fract(n*34.0))+0.5, smoothstep(0.9,0.8,size));
vec3 color = sin(vec3(0.2, 0.3, 0.9)*fract(n*2345.2)*6.2831)*0.5+0.5 ;
color *= vec3(1.0, 0.5, 1.0+size) ;
col += star * size * color ; // 크기가 크면 밝다. 작으면 어두워진다.
}
}
return col ;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = (fragCoord-0.5*iResolution.xy)/iResolution.y ;
uv *= 3.0;
//if(gv.x > 0.48 || gv.y > 0.48) col.r = 1.0 ; // 디버깅용 빨간줄
vec3 col = vec3(0.0) ;
col += StarLayer(uv) ;
fragColor = vec4(col,1.0);
}
/*
https://www.youtube.com/@TheArtofCodeIsCool
현재는 깊이감이 없는 레이어 하나다.
이후에 레이어 쌓아서 깊이감 추가한다.
*/
반복문을 돌려 랜덤 offset을 준다.
위치가 그리드 형태로 나오지 않게 된다.
현재는 레이어 하나다.
다음 예제에서 레이어 생성에 반복문을 적용해, 쌓아서 깊이감을 준다.
'셰이더 (Shader) > The Art of Code' 카테고리의 다른 글
[GLSL] Starfield - 5(완) : 마우스 상호작용, 별 팍 사라지는 이슈 수정 (0) | 2023.04.08 |
---|---|
[GLSL] Starfield - 4 : 별 깊이감, 움직임 추가 (0) | 2023.04.08 |
[GLSL] Starfield - 2 : 별 여러개 만들기 (1) (0) | 2023.03.30 |
[GLSL] Starfield - 1 : 별 만들기 (0) | 2023.03.30 |
댓글