local shader = [[ extern Image diffuse; extern vec2 mouse; extern number i ; vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords) { vec3 light_vec = vec3(mouse,1); vec3 light_direction = light_vec - vec3(pixel_coords, 0); float distance = length(light_direction); light_direction = normalize(light_direction); vec3 normal = Texel(texture, texture_coords).xyz; normal.y = 1 - normal.y; normal = normalize(mix(vec3(-1), vec3(1), normal)); //float attenuation = 1/(7e-5*pow(distance, 2)); float attenuation = 5000/pow(distance, 2); //float attenuation = 1; float diffuse_term = clamp(attenuation * dot(normal, light_direction), 0.0, 1.0); vec3 dark_color = vec3(0.0, 0.0, 1); //vec3 light_color = vec3(0.6, 0.6, 0.0); vec3 light_color = vec3(0.8, 0.8, 0.0); vec3 ambient = mix(dark_color, light_color, diffuse_term) * 0.20; // the shaded cel has a light value of 0.5, the light cel has a light value of 1 float cel_diffuse_term = smoothstep(0.49, 0.52, diffuse_term)/2 + 0.5; //float cel_diffuse_term = step(0.5, diffuse_term)/2 + 0.5; return vec4((cel_diffuse_term * Texel(diffuse, texture_coords).rgb) + ambient, Texel(texture, texture_coords).a); //return vec4(ambient+Texel(diffuse, texture_coords).rgb/100, Texel(texture, texture_coords).a); } ]] local shader2 = [[ extern Image diffuse; vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords) { return Texel(diffuse, texture_coords); } ]] local lighningShader = [[ extern vec2 iResolution; // 分辨率, pixels extern number iTime; // 秒数, seconds // Lightning shader // rand,noise,fmb functions from https://www.shadertoy.com/view/Xsl3zN // jerome float rand(vec2 n) { return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453); } float noise(vec2 n) { const vec2 d = vec2(0.0, 1.0); vec2 b = floor(n), f = smoothstep(vec2(0.0), vec2(1.0), fract(n)); return mix(mix(rand(b), rand(b + d.yx), f.x), mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y); } float fbm(vec2 n) { float total = 0.0, amplitude = 1.0; for (int i = 0; i < 7; i++) { total += noise(n) * amplitude; n += n; amplitude *= 0.5; } return total; } vec4 effect(vec4 outcolor, Image img, vec2 texture_coords, vec2 pixel_coords) //void mainImage( out vec4 fragColor, in vec2 fragCoord ) { vec4 col = vec4(0,0,0,1); vec2 uv = pixel_coords.xy * 1.0 / iResolution.xy; // draw a line, left side is fixed vec2 t = uv * vec2(2.0,1.0) - iTime*3.0; vec2 t2 = (vec2(1,-1) + uv) * vec2(2.0,1.0) - iTime*3.0; // a second strand // draw the lines, // this make the left side fixed, can be useful // float ycenter = mix( 0.5, 0.25 + 0.25*fbm( t ), uv.x*4.0); // float ycenter2 = mix( 0.5, 0.25 + 0.25*fbm( t2 ), uv.x*4.0); float ycenter = fbm(t)*0.5; float ycenter2= fbm(t2)*0.5; // falloff float diff = abs(uv.y - ycenter); float c1 = 1.0 - mix(0.0,1.0,diff*20.0); float diff2 = abs(uv.y - ycenter2); float c2 = 1.0 - mix(0.0,1.0,diff2*20.0); float c = max(c1,c2); col = vec4(c*0.6,0.2*c2,c,1.0); // purple color //fragColor = col; return col; } ]] local jg = jin.graphics local effect = jg.Shader(shader) local effect2 = jg.Shader(shader2) local lightning = jg.Shader(lighningShader) local diffuse = jg.Image("treestump_diffuse.png") local img = jg.Image("treestump.png") local img2 = jg.Image("lightning.png") local ww, wh = jg.size() local scale = 2 ww = ww / scale wh = wh / scale jin.core.onLoad = function() jg.use(lightning) lightning:send("vec2", "iResolution", ww, wh) jg.unuse() end jin.core.onEvent = function(e) if e.type == "quit" then jin.core.quit() end end local mx, my local c = 0 local t = 0; jin.core.onUpdate = function(dt) t = t + dt mx, my = jin.mouse.position() mx = mx / 2 my = my / 2 my = wh - my c = c + 1 if c == 50 then print(1/dt) c = 0 end end img:setAnchor(16, 16) local cvs = jg.Canvas(320, 240) local i = 0 jin.core.onDraw = function() -- if true then return end i = i + 0.001 jg.bind(cvs) jg.draw(img, 10, 10) -- jg.use(lightning) -- lightning:send("number", "iTime", t) -- lightning:send("Image", "img", img2) -- jg.draw(img2, 20, 20) -- jg.unuse() jg.unbind() jg.draw(cvs, 0, 0, 2, 2) end