|
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