From 9c2d6d7ed801b57407e682cf789eb6a982b6446a Mon Sep 17 00:00:00 2001 From: Rezmason Date: Sat, 17 Sep 2022 01:24:23 -0700 Subject: [PATCH] Adding "glint", the shapes that appear on top of the glyphs in the Resurrections opening titles. --- TODO.txt | 7 ++---- assets/resurrections_glint_msdf.png | Bin 0 -> 96539 bytes js/config.js | 36 ++++++++++++++++++++++++++-- js/regl/palettePass.js | 3 ++- js/regl/rainPass.js | 5 +++- js/regl/stripePass.js | 3 ++- js/regl/utils.js | 2 +- js/webgpu/palettePass.js | 1 + js/webgpu/rainPass.js | 14 ++++++++--- js/webgpu/stripePass.js | 1 + js/webgpu/utils.js | 8 +++++++ shaders/glsl/palettePass.frag.glsl | 5 ++-- shaders/glsl/rainPass.frag.glsl | 29 +++++++++++++++------- shaders/glsl/stripePass.frag.glsl | 7 +++--- shaders/wgsl/palettePass.wgsl | 6 +++-- shaders/wgsl/rainPass.wgsl | 28 ++++++++++++++++------ shaders/wgsl/stripePass.wgsl | 6 +++-- 17 files changed, 122 insertions(+), 39 deletions(-) create mode 100644 assets/resurrections_glint_msdf.png diff --git a/TODO.txt b/TODO.txt index a2fd2d6..6c068ce 100644 --- a/TODO.txt +++ b/TODO.txt @@ -17,14 +17,11 @@ Playdate version Maybe crank sounds? Not sure yet Support Resurrections anomaly streaks - Kind of like the cursor: new rain pass output channel, new config prop - MSDF - They should line up in Photoshop without too much trouble, actually - Texture - Maybe give normal Matrix code a pixel grill texture + grit texture multiply Lighting Different parts of a streak glow at different intensities, at different times The streaks often dim slower, ie. are brighter, than the glyphs beneath them + Different brightness/contrast? Imagine they're metallic or something Support Resurrections SDF bevel and "lights" diff --git a/assets/resurrections_glint_msdf.png b/assets/resurrections_glint_msdf.png new file mode 100644 index 0000000000000000000000000000000000000000..ff10297cb17a19bb5164d8bb56d977abc77fe738 GIT binary patch literal 96539 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 literal 0 HcmV?d00001 diff --git a/js/config.js b/js/config.js index 8bebc52..f009965 100644 --- a/js/config.js +++ b/js/config.js @@ -26,6 +26,7 @@ const fonts = { resurrections: { // The glyphs seen in the film trilogy glyphTexURL: "assets/resurrections_msdf.png", + glintTexURL: "assets/resurrections_glint_msdf.png", glyphSequenceLength: 135, glyphTextureGridSize: [13, 12], }, @@ -57,6 +58,8 @@ const defaults = { backgroundColor: [0, 0, 0], // The color "behind" the glyphs isolateCursor: true, // Whether the "cursor"— the brightest glyph at the bottom of a raindrop— has its own color cursorColor: [1.5, 2, 0.9], // The color of the cursor + isolateGlint: false, // Whether the "glint"— highlights on certain symbols in the font— should appear + glintColor: [1, 1, 1], // The color of the glint volumetric: false, // A mode where the raindrops appear in perspective animationSpeed: 1, // The global rate that all animations progress forwardSpeed: 0.25, // The speed volumetric rain approaches the eye @@ -188,6 +191,28 @@ const versions = { { hsl: [0.375, 1.0, 1.0], at: 1.0 }, ], }, + trinity: { + font: "resurrections", + glyphEdgeCrop: 0.1, + cursorColor: [1.4, 2, 1.2], + isolateGlint: true, + glintColor: [2, 1.5, 0.5], + baseBrightness: -0.9, + baseContrast: 1.5, + highPassThreshold: 0, + numColumns: 50, + cycleSpeed: 0.03, + bloomStrength: 0.7, + fallSpeed: 0.3, + paletteEntries: [ + { hsl: [0.4, 0.9, 0.0], at: 0.0 }, + { hsl: [0.4, 1.0, 0.5], at: 1.0 }, + ], + volumetric: true, + forwardSpeed: 0.2, + raindropLength: 0.3, + density: 0.5, + }, palimpsest: { font: "huberfishA", isolateCursor: false, @@ -303,6 +328,7 @@ const paramMapping = { stripeColors: { key: "stripeColors", parser: (s) => s }, backgroundColor: { key: "backgroundColor", parser: (s) => s.split(",").map(parseFloat) }, cursorColor: { key: "cursorColor", parser: (s) => s.split(",").map(parseFloat) }, + glintColor: { key: "glintColor", parser: (s) => s.split(",").map(parseFloat) }, volumetric: { key: "volumetric", parser: (s) => s.toLowerCase().includes("true") }, loops: { key: "loops", parser: (s) => s.toLowerCase().includes("true") }, renderer: { key: "renderer", parser: (s) => s }, @@ -321,8 +347,14 @@ export default (urlParams) => { .filter(([_, value]) => value != null) ); - if (validParams.effect != null && validParams.cursorColor == null) { - validParams.cursorColor = [2, 2, 2]; + if (validParams.effect != null) { + if (validParams.cursorColor == null) { + validParams.cursorColor = [2, 2, 2]; + } + + if (validParams.glintColor == null) { + validParams.glintColor = [1, 1, 1]; + } } const version = validParams.version in versions ? versions[validParams.version] : versions.classic; diff --git a/js/regl/palettePass.js b/js/regl/palettePass.js index 065ee6e..83cbd71 100644 --- a/js/regl/palettePass.js +++ b/js/regl/palettePass.js @@ -65,7 +65,7 @@ const makePalette = (regl, entries) => { export default ({ regl, config }, inputs) => { const output = makePassFBO(regl, config.useHalfFloat); const palette = makePalette(regl, config.paletteEntries); - const { backgroundColor, cursorColor, ditherMagnitude, bloomStrength } = config; + const { backgroundColor, cursorColor, glintColor, ditherMagnitude, bloomStrength } = config; const palettePassFrag = loadText("shaders/glsl/palettePass.frag.glsl"); @@ -75,6 +75,7 @@ export default ({ regl, config }, inputs) => { uniforms: { backgroundColor, cursorColor, + glintColor, ditherMagnitude, bloomStrength, tex: inputs.primary, diff --git a/js/regl/rainPass.js b/js/regl/rainPass.js index 31e4f6d..464ed2f 100644 --- a/js/regl/rainPass.js +++ b/js/regl/rainPass.js @@ -116,6 +116,7 @@ export default ({ regl, config, lkg }) => { // We render the code into an FBO using MSDFs: https://github.com/Chlumsky/msdfgen const msdf = loadImage(regl, config.glyphTexURL); + const glintMSDF = loadImage(regl, config.glintTexURL); const rainPassVert = loadText("shaders/glsl/rainPass.vert.glsl"); const rainPassFrag = loadText("shaders/glsl/rainPass.frag.glsl"); const output = makePassFBO(regl, config.useHalfFloat); @@ -131,6 +132,7 @@ export default ({ regl, config, lkg }) => { "brightnessThreshold", "brightnessOverride", "isolateCursor", + "isolateGlint", "glyphEdgeCrop", "isPolar", ]), @@ -160,6 +162,7 @@ export default ({ regl, config, lkg }) => { symbolState: symbolDoubleBuffer.front, effectState: effectDoubleBuffer.front, glyphTex: msdf.texture, + glintTex: glintMSDF.texture, camera: regl.prop("camera"), transform: regl.prop("transform"), @@ -201,7 +204,7 @@ export default ({ regl, config, lkg }) => { { primary: output, }, - Promise.all([msdf.loaded, rainPassShine.loaded, rainPassSymbol.loaded, rainPassVert.loaded, rainPassFrag.loaded]), + Promise.all([msdf.loaded, glintMSDF.loaded, rainPassShine.loaded, rainPassSymbol.loaded, rainPassVert.loaded, rainPassFrag.loaded]), (w, h) => { output.resize(w, h); const aspectRatio = w / h; diff --git a/js/regl/stripePass.js b/js/regl/stripePass.js index 903a1ef..d82e032 100644 --- a/js/regl/stripePass.js +++ b/js/regl/stripePass.js @@ -31,7 +31,7 @@ const prideStripeColors = [ export default ({ regl, config }, inputs) => { const output = makePassFBO(regl, config.useHalfFloat); - const { backgroundColor, cursorColor, ditherMagnitude, bloomStrength } = config; + const { backgroundColor, cursorColor, glintColor, ditherMagnitude, bloomStrength } = config; // Expand and convert stripe colors into 1D texture data const stripeColors = @@ -50,6 +50,7 @@ export default ({ regl, config }, inputs) => { uniforms: { backgroundColor, cursorColor, + glintColor, ditherMagnitude, bloomStrength, tex: inputs.primary, diff --git a/js/regl/utils.js b/js/regl/utils.js index 885abea..a56e31b 100644 --- a/js/regl/utils.js +++ b/js/regl/utils.js @@ -30,7 +30,7 @@ const loadImage = (regl, url) => { let loaded = false; return { texture: () => { - if (!loaded) { + if (!loaded && url != null) { console.warn(`texture still loading: ${url}`); } return texture; diff --git a/js/webgpu/palettePass.js b/js/webgpu/palettePass.js index 126c1b6..960c0fa 100644 --- a/js/webgpu/palettePass.js +++ b/js/webgpu/palettePass.js @@ -108,6 +108,7 @@ export default ({ config, device, timeBuffer }) => { ditherMagnitude: config.ditherMagnitude, backgroundColor: config.backgroundColor, cursorColor: config.cursorColor, + glintColor: config.glintColor, }); const paletteUniforms = paletteShaderUniforms.Palette; diff --git a/js/webgpu/rainPass.js b/js/webgpu/rainPass.js index d43023e..75b95f3 100644 --- a/js/webgpu/rainPass.js +++ b/js/webgpu/rainPass.js @@ -26,7 +26,7 @@ const makeConfigBuffer = (device, configUniforms, config, density, gridSize) => export default ({ config, device, timeBuffer }) => { const { mat4, vec3 } = glMatrix; - const assets = [loadTexture(device, config.glyphTexURL), loadShader(device, "shaders/wgsl/rainPass.wgsl")]; + const assets = [loadTexture(device, config.glyphTexURL), loadTexture(device, config.glintTexURL), loadShader(device, "shaders/wgsl/rainPass.wgsl")]; // The volumetric mode multiplies the number of columns // to reach the desired density, and then overlaps them @@ -85,7 +85,7 @@ export default ({ config, device, timeBuffer }) => { let highPassOutput; const loaded = (async () => { - const [msdfTexture, rainShader] = await Promise.all(assets); + const [msdfTexture, glintMSDFTexture, rainShader] = await Promise.all(assets); const rainShaderUniforms = structs.from(rainShader.code); configBuffer = makeConfigBuffer(device, rainShaderUniforms.Config, config, density, gridSize); @@ -143,7 +143,15 @@ export default ({ config, device, timeBuffer }) => { ]); computeBindGroup = makeBindGroup(device, computePipeline, 0, [configBuffer, timeBuffer, cellsBuffer]); - renderBindGroup = makeBindGroup(device, renderPipeline, 0, [configBuffer, timeBuffer, sceneBuffer, linearSampler, msdfTexture.createView(), cellsBuffer]); + renderBindGroup = makeBindGroup(device, renderPipeline, 0, [ + configBuffer, + timeBuffer, + sceneBuffer, + linearSampler, + msdfTexture.createView(), + glintMSDFTexture.createView(), + cellsBuffer, + ]); })(); const build = (size) => { diff --git a/js/webgpu/stripePass.js b/js/webgpu/stripePass.js index 64467d4..667422a 100644 --- a/js/webgpu/stripePass.js +++ b/js/webgpu/stripePass.js @@ -79,6 +79,7 @@ export default ({ config, device, timeBuffer }) => { ditherMagnitude: config.ditherMagnitude, backgroundColor: config.backgroundColor, cursorColor: config.cursorColor, + glintColor: config.glintColor, }); })(); diff --git a/js/webgpu/utils.js b/js/webgpu/utils.js index ecee5d3..608fc24 100644 --- a/js/webgpu/utils.js +++ b/js/webgpu/utils.js @@ -20,6 +20,14 @@ const loadTexture = async (device, url) => { */ const loadTexture = async (device, url) => { + if (url == null) { + return device.createTexture({ + size: [1, 1, 1], + format: "rgba8unorm", + usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, + }); + } + const image = new Image(); image.crossOrigin = "Anonymous"; image.src = url; diff --git a/shaders/glsl/palettePass.frag.glsl b/shaders/glsl/palettePass.frag.glsl index b2d5322..753f856 100644 --- a/shaders/glsl/palettePass.frag.glsl +++ b/shaders/glsl/palettePass.frag.glsl @@ -7,7 +7,7 @@ uniform sampler2D palette; uniform float bloomStrength; uniform float ditherMagnitude; uniform float time; -uniform vec3 backgroundColor, cursorColor; +uniform vec3 backgroundColor, cursorColor, glintColor; varying vec2 vUV; highp float rand( const in vec2 uv, const in float t ) { @@ -26,12 +26,13 @@ void main() { vec4 brightness = getBrightness(vUV); // Dither: subtract a random value from the brightness - brightness -= rand( gl_FragCoord.xy, time ) * ditherMagnitude; + brightness -= rand( gl_FragCoord.xy, time ) * ditherMagnitude / 3.0; // Map the brightness to a position in the palette texture gl_FragColor = vec4( texture2D( palette, vec2(brightness.r, 0.0)).rgb + min(cursorColor * brightness.g, vec3(1.0)) + + min(glintColor * brightness.b, vec3(1.0)) + backgroundColor, 1.0 ); diff --git a/shaders/glsl/rainPass.frag.glsl b/shaders/glsl/rainPass.frag.glsl index 0b8e138..2ec4937 100644 --- a/shaders/glsl/rainPass.frag.glsl +++ b/shaders/glsl/rainPass.frag.glsl @@ -6,7 +6,7 @@ precision lowp float; uniform sampler2D raindropState, symbolState, effectState; uniform float numColumns, numRows; -uniform sampler2D glyphTex; +uniform sampler2D glyphTex, glintTex; uniform float glyphHeightToWidth, glyphSequenceLength, glyphEdgeCrop; uniform float baseContrast, baseBrightness; uniform float brightnessOverride, brightnessThreshold; @@ -16,7 +16,7 @@ uniform float slantScale; uniform bool isPolar; uniform bool showDebugView; uniform bool volumetric; -uniform bool isolateCursor; +uniform bool isolateCursor, isolateGlint; varying vec2 vUV; varying vec4 vRaindrop, vSymbol, vEffect; @@ -87,7 +87,7 @@ vec2 getSymbolUV(float index) { return vec2(symbolX, symbolY); } -float getSymbol(vec2 uv, float index) { +vec2 getSymbol(vec2 uv, float index) { // resolve UV to cropped position of glyph in MSDF texture uv = fract(uv * vec2(numColumns, numRows)); uv -= 0.5; @@ -96,9 +96,20 @@ float getSymbol(vec2 uv, float index) { uv = (uv + getSymbolUV(index)) / glyphTextureGridSize; // MSDF: calculate brightness of fragment based on distance to shape - vec3 dist = texture2D(glyphTex, uv).rgb; - float sigDist = median3(dist) - 0.5; - return clamp(sigDist / fwidth(sigDist) + 0.5, 0., 1.); + vec2 symbol; + { + vec3 dist = texture2D(glyphTex, uv).rgb; + float sigDist = median3(dist) - 0.5; + symbol.r = clamp(sigDist / fwidth(sigDist) + 0.5, 0., 1.); + } + + if (isolateGlint) { + vec3 dist = texture2D(glintTex, uv).rgb; + float sigDist = median3(dist) - 0.5; + symbol.g = clamp(sigDist / fwidth(sigDist) + 0.5, 0., 1.); + } + + return symbol; } void main() { @@ -111,7 +122,7 @@ void main() { vec4 effectData = volumetric ? vEffect : texture2D( effectState, uv); vec2 brightness = getBrightness(raindropData.r, raindropData.g, effectData.r, effectData.g); - float symbol = getSymbol(uv, symbolData.r); + vec2 symbol = getSymbol(uv, symbolData.r); if (showDebugView) { gl_FragColor = vec4( @@ -121,10 +132,10 @@ void main() { 1. - (raindropData.r * 3.), 1. - (raindropData.r * 8.) ) * (1. - raindropData.g) - ) * symbol, + ) * symbol.r, 1. ); } else { - gl_FragColor = vec4(brightness * symbol, 0., 0.); + gl_FragColor = vec4(brightness * symbol.r, brightness.r * symbol.g, 0.); } } diff --git a/shaders/glsl/stripePass.frag.glsl b/shaders/glsl/stripePass.frag.glsl index 18ea0ac..425a0a4 100644 --- a/shaders/glsl/stripePass.frag.glsl +++ b/shaders/glsl/stripePass.frag.glsl @@ -7,7 +7,7 @@ uniform float bloomStrength; uniform sampler2D stripes; uniform float ditherMagnitude; uniform float time; -uniform vec3 backgroundColor, cursorColor; +uniform vec3 backgroundColor, cursorColor, glintColor; varying vec2 vUV; highp float rand( const in vec2 uv, const in float t ) { @@ -28,11 +28,12 @@ void main() { vec4 brightness = getBrightness(vUV); // Dither: subtract a random value from the brightness - brightness -= rand( gl_FragCoord.xy, time ) * ditherMagnitude; + brightness -= rand( gl_FragCoord.xy, time ) * ditherMagnitude / 3.0; gl_FragColor = vec4( color * brightness.r - + min(cursorColor * brightness.g, 1.0) + + min(cursorColor * brightness.g, vec3(1.0)) + + min(glintColor * brightness.b, vec3(1.0)) + backgroundColor, 1.0 ); diff --git a/shaders/wgsl/palettePass.wgsl b/shaders/wgsl/palettePass.wgsl index 06f01ee..d46365e 100644 --- a/shaders/wgsl/palettePass.wgsl +++ b/shaders/wgsl/palettePass.wgsl @@ -2,7 +2,8 @@ struct Config { bloomStrength : f32, ditherMagnitude : f32, backgroundColor : vec3, - cursorColor : vec3 + cursorColor : vec3, + glintColor : vec3, }; struct Palette { @@ -58,7 +59,7 @@ fn getBrightness(uv : vec2) -> vec4 { var brightness = getBrightness(uv); // Dither: subtract a random value from the brightness - brightness -= randomFloat( uv + vec2(time.seconds) ) * config.ditherMagnitude; + brightness -= randomFloat( uv + vec2(time.seconds) ) * config.ditherMagnitude / 3.0; // Map the brightness to a position in the palette texture var paletteIndex = clamp(i32(brightness.r * 512.0), 0, 511); @@ -66,6 +67,7 @@ fn getBrightness(uv : vec2) -> vec4 { textureStore(outputTex, coord, vec4( palette.colors[paletteIndex] + min(config.cursorColor * brightness.g, vec3(1.0)) + + min(config.glintColor * brightness.b, vec3(1.0)) + config.backgroundColor, 1.0 )); diff --git a/shaders/wgsl/rainPass.wgsl b/shaders/wgsl/rainPass.wgsl index 5165dde..5309a3b 100644 --- a/shaders/wgsl/rainPass.wgsl +++ b/shaders/wgsl/rainPass.wgsl @@ -37,6 +37,7 @@ struct Config { slantVec : vec2, volumetric : i32, isolateCursor : i32, + isolateGlint : i32, loops : i32, highPassThreshold : f32, }; @@ -76,7 +77,8 @@ struct CellData { @group(0) @binding(2) var scene : Scene; @group(0) @binding(3) var linearSampler : sampler; @group(0) @binding(4) var msdfTexture : texture_2d; -@group(0) @binding(5) var cells_RO : CellData; +@group(0) @binding(5) var glintMSDFTexture : texture_2d; +@group(0) @binding(6) var cells_RO : CellData; // Shader params @@ -401,7 +403,7 @@ fn getSymbolUV(symbol : i32) -> vec2 { return vec2(f32(symbolX), f32(symbolY)); } -fn getSymbol(cellUV : vec2, index : i32) -> f32 { +fn getSymbol(cellUV : vec2, index : i32) -> vec2 { // resolve UV to cropped position of glyph in MSDF texture var uv = fract(cellUV * config.gridSize); uv.y = 1.0 - uv.y; // WebGL -> WebGPU y-flip @@ -410,10 +412,22 @@ fn getSymbol(cellUV : vec2, index : i32) -> f32 { uv += 0.5; uv = (uv + getSymbolUV(index)) / vec2(config.glyphTextureGridSize); + var symbol = vec2(); + // MSDF: calculate brightness of fragment based on distance to shape - var dist = textureSample(msdfTexture, linearSampler, uv).rgb; - var sigDist = median3(dist) - 0.5; - return clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0); + { + var dist = textureSample(msdfTexture, linearSampler, uv).rgb; + var sigDist = median3(dist) - 0.5; + symbol.r = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0); + } + + if (bool(config.isolateGlint)) { + var dist = textureSample(glintMSDFTexture, linearSampler, uv).rgb; + var sigDist = median3(dist) - 0.5; + symbol.g = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0); + } + + return symbol; } // Fragment shader @@ -446,11 +460,11 @@ fn getSymbol(cellUV : vec2, index : i32) -> f32 { 1.0 - (cell.raindrop.r * 3.0), 1.0 - (cell.raindrop.r * 8.0) ) * (1.0 - cell.raindrop.g) - ) * symbol, + ) * symbol.r, 1.0 ); } else { - output.color = vec4(brightness * symbol, 0.0, 0.0); + output.color = vec4(brightness * symbol.r, brightness.r * symbol.g, 0.0); } var highPassColor = output.color; diff --git a/shaders/wgsl/stripePass.wgsl b/shaders/wgsl/stripePass.wgsl index d74f1f8..3b4b18a 100644 --- a/shaders/wgsl/stripePass.wgsl +++ b/shaders/wgsl/stripePass.wgsl @@ -2,7 +2,8 @@ struct Config { bloomStrength : f32, ditherMagnitude : f32, backgroundColor : vec3, - cursorColor : vec3 + cursorColor : vec3, + glintColor : vec3, }; struct Time { @@ -56,11 +57,12 @@ fn getBrightness(uv : vec2) -> vec4 { var brightness = getBrightness(uv); // Dither: subtract a random value from the brightness - brightness -= randomFloat( uv + vec2(time.seconds) ) * config.ditherMagnitude; + brightness -= randomFloat( uv + vec2(time.seconds) ) * config.ditherMagnitude / 3.0; textureStore(outputTex, coord, vec4( color * brightness.r + min(config.cursorColor * brightness.g, vec3(1.0)) + + min(config.glintColor * brightness.b, vec3(1.0)) + config.backgroundColor, 1.0 ));