Memorandum of Shadertoy Learning. part1
I’m trying shadertoy these days. This is my tutorial for shadertoy.
1 main function
void mainImage( out vec4 fragColor, in vec2 fragCoord ) is the entry point in Shadertoy.
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { //main drawing process is here }
Variable fragCoord contains the pixel coordinates for which the shader needs to compute a color. The resulting color is gathered in fragColor as a four component vector
Modifiers
- in
- an “in” variable is used only in this function and not output.
- out
- an “out” variable is an output variable that can be passed by reference.
- inout
- an “inout” variable is an output and input variable.
2 fragColor
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
fragColor = vec4(0.98, 0.808, 0.333, 1.0);
}
Assign vec4 (R, G, B, alpha) to fragColor variable.
3 fragCoord
variable fragCoord is coordinate of target pixel. fragCoord.x is x coordinate and fragCoord.y is y coordinate and fragCoord.xy is (x,y) coordinate.
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec3 color1 = vec3(1.0, 1.0, 0.5); vec3 color2 = vec3(0.98, 0.808, 0.333); if (int(fragCoord.x )% 50 < 25){ fragColor = vec4(color1, 1.0); } else{ fragColor = vec4(color2, 1.0); } }
4 iResolution
Uniform variable iResolution passes the resolution of the image to the shader. iResolution.x is x coordinate and iResolution.y is y coordinate and iResolution.xy is (x,y) coordinate.
void mainImage( out vec4 fragColor, in vec2 fragCoord ) { int n = 4; int width = int(iResolution.x)/n; if (int(fragCoord.x )% width < width/2){ fragColor = vec4(1.0, 1.0, 1.0-fragCoord.y/iResolution.y, 1.0); } else{ fragColor = vec4(1.0, 0.0, fragCoord.y/iResolution.y, 1.0); } }
5 Conditional branch and color setting
Check the article “How to Convert HSV to RGB” for more information about hsv2rgb.
vec3 hsv2rgb(in vec3 hsv){ vec3 rgb; float h = hsv.x * 360.0; float s = hsv.y; float v = hsv.z; float c =v * s; float h2 = h/60.0; float x = c*(1.0 - abs( mod(h2, 2.0) - 1.0)); switch(int(h2)){ case 0: rgb = vec3(v-c) + vec3(c, x, 0.0); return rgb; case 1: rgb = vec3(v-c) + vec3(x, c, 0.0); return rgb; case 2: rgb = vec3(v-c) + vec3(0.0, c, x); return rgb; case 3: rgb = vec3(v-c) + vec3(0.0, x, c); return rgb; case 4: rgb = vec3(v-c) + vec3(x, 0.0, c); return rgb; case 5: rgb = vec3(v-c) + vec3(c, 0.0, x); return rgb; case 6: rgb = vec3(v-c) + vec3(c, x, 0.0); return rgb; } } void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec2 coordinate = fragCoord.xy - 0.5*iResolution.xy; vec3 pixel_color = vec3(0.5); int gradation = 10; int r_width = int(0.5*iResolution.y/float(gradation)); int r; for(int i =0; i<gradation+1; i++){ r = r_width*i; float i_flaot = float(float(i)/float(gradation+1)); if(coordinate.x*coordinate.x + coordinate.y*coordinate.y < float(r*r)){ pixel_color = hsv2rgb(vec3((1.0/float(gradation))*float(i), 1.0, 1.0)); break; } } fragColor = vec4(pixel_color, 1.0); }