colors

개별요소 접근

vec4 vector;
vector[0] = vector.r = vector.x = vector.s;
vector[1] = vector.g = vector.y = vector.t;
vector[2] = vector.b = vector.z = vector.p;
vector[3] = vector.a = vector.w = vector.q;

mix(r 값, b 값, g값의 혼합)

#ifdef GL_ES
precision mediump float;
#endif

#define PI 3.14159265359

uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

vec3 colorA = vec3(0.149,0.141,0.912);
vec3 colorB = vec3(1.000,0.833,0.224);

float plot (vec2 st, float pct){
  return  smoothstep( pct-0.01, pct, st.y) -
          smoothstep( pct, pct+0.01, st.y);
}

void main() {
    vec2 st = gl_FragCoord.xy/u_resolution.xy;
    vec3 color = vec3(0.0);

    vec3 pct = vec3(st.x);

    // pct.r = smoothstep(0.0,1.0, st.x);
    // pct.g = sin(st.x*PI);
    // pct.b = pow(st.x,0.5);

    color = mix(colorA, colorB, pct);

    // Plot transition lines for each channel
    color = mix(color,vec3(1.0,0.0,0.0),plot(st,pct.r));
    color = mix(color,vec3(0.0,1.0,0.0),plot(st,pct.g));
    color = mix(color,vec3(0.0,0.0,1.0),plot(st,pct.b));

    gl_FragColor = vec4(color,1.0);
}


atan

  • Return the arc-tangent of the parameters


qualifier

  • in (default) 깊은 복사
  • out default로 initialize
  • inout reference 복사


Shaping Function

  • rectangle
vec3 rect(vec2 coord, vec2 loc, vec2 size){
    vec2 sw = loc -size/2.;
    vec2 ne = loc+size/2.;
    vec2 pct = step(sw, coord);
    pct -= step(ne, coord);
    return vec3(pct.x * pct.y);

}

void main() {
    vec2 coord = gl_FragCoord.xy/u_resolution;
    vec3 col = rect(coord, vec2(.5), vec2(.5));
    gl_FragColor = vec4(col, 1.);
}
  • circle
vec3 circle(vec2 coord, vec2 loc, float r){

    float d;
    d = length(coord - loc);
    d = smoothstep(r, r+0.01, d);
    return vec3(d);    
}

void main() {
    vec2 coord = gl_FragCoord.xy/u_resolution;
    vec3 col = circle(coord, vec2(.5), .3);
    gl_FragColor = vec4(col, 1.);
}
  • circle2
void main() {
    vec2 coord = gl_FragCoord.xy/u_resolution;
    coord.x *= u_resolution.x/u_resolution.y;
    
    coord = coord*2. - 1.;
    
    vec2 point = vec2(.3);
    
    float d = distance(abs(coord), point);
    d = mod(d*10., 1.);
    vec3 col = vec3(d);
    
    gl_FragCoord = vec4(col, 1.);
}
  • circle3
void main() {
    vec2 coord = gl_FragCoord.xy/u_resolution;
    coord = coord*2. - 1.;
    coord.x *= u_resolution.x/u_resolution.y;

    float a = atan(coord.y, coord.x);
    float d = length(coord);

    a += 0.;
    a *= 3.;
    
    float r = sin(a);
    vec3 col = vec3(step(r, d));
    
    gl_FragCoord = vec4(col, 1.);
}


출처

https://thebookofshaders.com/ https://opentutorials.org/module/3659/21954