|
1 | 1 | p5.disableFriendlyErrors = true; |
| 2 | + |
2 | 3 | function windowResized() { |
3 | 4 | resizeCanvas(windowWidth, windowHeight); |
4 | 5 | } |
5 | 6 |
|
6 | | -let myModel; |
7 | 7 | let starShader; |
8 | 8 | let starStrokeShader; |
9 | 9 | let stars; |
10 | | -let ditheringShader; |
11 | 10 | let originalFrameBuffer; |
12 | | -let blurredFrameBuffer; |
| 11 | +let pixellizeShader; |
| 12 | +let fresnelShader; |
| 13 | +let bloomShader; |
| 14 | + |
| 15 | +function fresnelShaderCallback() { |
| 16 | + const fresnelPower = uniformFloat(2); |
| 17 | + const fresnelBias = uniformFloat(-0.1); |
| 18 | + const fresnelScale = uniformFloat(2); |
| 19 | + getCameraInputs((inputs) => { |
| 20 | + let n = normalize(inputs.normal); |
| 21 | + let v = normalize(-inputs.position); |
| 22 | + let base = 1.0 - dot(n, v); |
| 23 | + let fresnel = fresnelScale * pow(base, fresnelPower) + fresnelBias; |
| 24 | + let col = mix([0, 0, 0], [1, .5, .7], fresnel); |
| 25 | + inputs.color = [col, 1]; |
| 26 | + return inputs; |
| 27 | + }); |
| 28 | +} |
13 | 29 |
|
14 | 30 | function starShaderCallback() { |
15 | 31 | const time = uniformFloat(() => millis()); |
| 32 | + const skyRadius = uniformFloat(1000); |
| 33 | + |
| 34 | + function rand2(st) { |
| 35 | + return fract(sin(dot(st, [12.9898, 78.233])) * 43758.5453123); |
| 36 | + } |
| 37 | + |
| 38 | + function semiSphere() { |
| 39 | + let id = instanceID(); |
| 40 | + let theta = rand2([id, 0.1234]) * TWO_PI; |
| 41 | + let phi = rand2([id, 3.321]) * PI+time/10000; |
| 42 | + let r = skyRadius; |
| 43 | + r *= 1.5 * sin(phi); |
| 44 | + let x = r * sin(phi) * cos(theta); |
| 45 | + let y = r * 1.5 * cos(phi); |
| 46 | + let z = r * sin(phi) * sin(theta); |
| 47 | + return [x, y, z]; |
| 48 | + } |
| 49 | + |
16 | 50 | getWorldInputs((inputs) => { |
17 | | - inputs.position.y += instanceID() * 20 - 1000; |
18 | | - inputs.position.x += 40 * sin(time * 0.001 + instanceID()); |
| 51 | + inputs.position += semiSphere(); |
19 | 52 | return inputs; |
20 | 53 | }); |
| 54 | + |
21 | 55 | getObjectInputs((inputs) => { |
22 | | - inputs.position *= sin(time*0.001 + instanceID()); |
| 56 | + let scale = 1 + 0.1 * sin(time * 0.002 + instanceID()); |
| 57 | + inputs.position *= scale; |
23 | 58 | return inputs; |
24 | | - }) |
| 59 | + }); |
25 | 60 | } |
26 | 61 |
|
27 | | -function ditheringCallback() { |
28 | | - const time = uniformFloat(() => millis()) |
29 | | - |
30 | | - function rand(co) { |
31 | | - return fract(sin(dot(co, [12.9898, 78.233])) * 43758.5453); |
32 | | - } |
33 | | - |
34 | | - function grayscale(col) { |
35 | | - return dot([col.x, col.y, col.z], [0.21, 0.72, 0.07]) |
36 | | - } |
37 | | - |
| 62 | +function pixellizeShaderCallback() { |
| 63 | + const pixelSize = uniformFloat(()=> width*.75); |
38 | 64 | getColor((input, canvasContent) => { |
39 | | - let col = texture(canvasContent, input.texCoord); |
40 | | - col.z = 0.55; |
41 | | - col += rand(input.texCoord + time/10000000000) * 0.15 - 0.05; |
42 | | - let greyscaleValue = grayscale(col); |
43 | | - col.x = greyscaleValue |
44 | | - col.y = greyscaleValue |
| 65 | + let coord = input.texCoord; |
| 66 | + coord = floor(coord * pixelSize) / pixelSize; |
| 67 | + let col = texture(canvasContent, coord); |
45 | 68 | return col; |
46 | 69 | }); |
47 | 70 | } |
48 | 71 |
|
49 | | -function bloom() { |
50 | | - const blurred = uniformTexture(() => blurredFrameBuffer); |
51 | | - const original = uniformTexture(() => originalFrameBuffer); |
52 | | - |
| 72 | +function bloomShaderCallback() { |
| 73 | + const preBlur = uniformTexture(() => originalFrameBuffer); |
53 | 74 | getColor((input, canvasContent) => { |
54 | | - const blurredCol = texture(blurred, input.texCoord); |
55 | | - const originalCol = texture(original, input.texCoord); |
56 | | - const brightPass = max(originalCol - 0.0, 0.0) * 3.0; |
57 | | - // const bloom = original + blurred * brightPass; |
58 | | - // return bloom; |
59 | | - return texture(blurred, input.texCoord) + texture(original, input.texCoord); |
| 75 | + const blurredCol = texture(canvasContent, input.texCoord); |
| 76 | + const originalCol = texture(preBlur, input.texCoord); |
| 77 | + const brightPass = max(originalCol, 0.3) * 1.5; |
| 78 | + const bloom = originalCol + blurredCol * brightPass; |
| 79 | + return bloom; |
60 | 80 | }); |
61 | 81 | } |
62 | 82 |
|
63 | 83 | async function setup(){ |
64 | 84 | createCanvas(windowWidth, windowHeight, WEBGL); |
65 | | - stars = buildGeometry(() => sphere(20, 3, 3)) |
| 85 | + stars = buildGeometry(() => sphere(30, 4, 2)) |
| 86 | + originalFrameBuffer = createFramebuffer(); |
| 87 | + |
66 | 88 | starShader = baseMaterialShader().modify(starShaderCallback); |
67 | 89 | starStrokeShader = baseStrokeShader().modify(starShaderCallback) |
68 | | - ditheringShader = baseFilterShader().modify(ditheringCallback); |
69 | | - originalFrameBuffer = createFramebuffer(); |
70 | | - blurredFrameBuffer = createFramebuffer(); |
71 | | - bloomShader = baseFilterShader().modify(bloom); |
| 90 | + fresnelShader = baseColorShader().modify(fresnelShaderCallback); |
| 91 | + bloomShader = baseFilterShader().modify(bloomShaderCallback); |
| 92 | + pixellizeShader = baseFilterShader().modify(pixellizeShaderCallback); |
72 | 93 | } |
73 | 94 |
|
74 | 95 | function draw(){ |
75 | 96 | originalFrameBuffer.begin(); |
| 97 | + background(0); |
76 | 98 | orbitControl(); |
77 | | - background(0,0,0); |
78 | | - push(); |
79 | | - stroke(255,0,255) |
80 | | - fill(255,200,255) |
| 99 | + |
| 100 | + push() |
| 101 | + strokeWeight(4) |
| 102 | + stroke(255,0,0) |
| 103 | + rotateX(PI/2 + millis() * 0.0005); |
| 104 | + fill(255,100, 150) |
81 | 105 | strokeShader(starStrokeShader) |
82 | 106 | shader(starShader); |
83 | | - model(stars, 100); |
84 | | - pop(); |
| 107 | + model(stars, 2000); |
| 108 | + pop() |
| 109 | + |
| 110 | + push() |
| 111 | + shader(fresnelShader) |
| 112 | + noStroke() |
| 113 | + sphere(500); |
| 114 | + pop() |
| 115 | + filter(pixellizeShader); |
| 116 | + |
85 | 117 | originalFrameBuffer.end(); |
86 | 118 |
|
87 | | - blurredFrameBuffer.begin(); |
88 | | - image(originalFrameBuffer, -windowWidth/2, -windowHeight/2) |
89 | | - filter(BLUR) |
90 | | - blurredFrameBuffer.end(); |
91 | | - |
92 | | - // image(originalFrameBuffer, -windowWidth/2, -windowHeight/2) |
| 119 | + imageMode(CENTER) |
| 120 | + image(originalFrameBuffer, 0, 0) |
| 121 | + |
| 122 | + filter(BLUR, 20) |
93 | 123 | filter(bloomShader); |
94 | 124 | } |
0 commit comments