Shader/TheBookofShaders

rotate & scale

BroJune 2021. 8. 19. 02:07

rotate & scale

 



Dot = 내적연산

Cross = 외적연산

실제로 사용하고 있음므로

 

crucis = cross의 라틴어로 대체

 



#ifdef GL_ES

precision mediump float;

#endif

 

uniform vec2 u_resolution;

uniform vec2 u_mouse;

uniform float u_time;

 

float rect(vec2 loc, vec2 size, vec2 coord){

    vec2 sw = loc - size/2.;

    vec2 ne = loc + size/2.;

    

    float pad = 0.01;

    vec2 rect = smoothstep(sw-pad, sw, coord);

    rect -= smoothstep(ne, ne+pad, coord);

    return(rect.x*rect.y);

}

 

mat2 rotate2d(float _angle){

    return mat2(cos(_angle),-sin(_angle),

                sin(_angle),cos(_angle));

}

 

float crucis(vec2 loc, vec2 size, vec2 coord){

float r1 = rect(loc, size, coord);

    float r2 = rect(loc, vec2(size.y,size.x), coord);   

return max(r1, r2);

}

 

void main(){

vec2 coord = gl_FragCoord.xy/u_resolution;

    coord = coord*2.-1.;

    coord.x *= u_resolution.x/u_resolution.y;

    

    coord = coord*(sin(u_time));

    // coord = coord*1.;

    // 숫자가 작아 질수록 커지고 커질수록 작아진다.

    // 화면을 멀리서 보는 효과때문이다.

        

    coord *= rotate2d(3.*sin(u_time));  // rotate는 값이 커질수록 오른쪽으로 돈다.

    // coord = coord*rotate2d(0.);

    

    

    vec3 col = vec3(crucis(vec2(.0), vec2(0.600,0.110), coord));

    gl_FragColor = vec4(col, 1.);

}