let NUM_VERTICES_PER_QUAD:i32 = 6; let PI:f32 = 3.14159265359; let TWO_PI:f32 = 6.28318530718; // No, I'm not using Tau. [[block]] struct Uniforms { numColumns: i32; numRows: i32; }; [[group(0), binding(0)]] var uniforms:Uniforms; [[block]] struct MSDFUniforms { numColumns: i32; }; [[group(1), binding(0)]] var msdfUniforms:MSDFUniforms; [[group(1), binding(1)]] var msdfSampler: sampler; [[group(1), binding(2)]] var msdfTexture: texture_2d; [[block]] struct TimeUniforms { now: i32; frame: i32; }; [[group(2), binding(0)]] var timeUniforms:TimeUniforms; [[block]] struct CameraUniforms { screenSize: vec2; }; [[group(3), binding(0)]] var cameraUniforms:CameraUniforms; // Vertex shader struct VertexOutput { [[builtin(position)]] Position:vec4; [[location(0)]] UV:vec2; }; [[stage(vertex)]] fn vertMain([[builtin(vertex_index)]] VertexIndex:u32) -> VertexOutput { var i = i32(VertexIndex); var quadIndex = i / NUM_VERTICES_PER_QUAD; var cornerPosition = vec2( f32(i % 2), f32(((i + 1) % NUM_VERTICES_PER_QUAD / 3)) ); var position = cornerPosition; position = position + vec2( f32(quadIndex % uniforms.numColumns), f32(quadIndex / uniforms.numColumns) ); position = position / vec2( f32(uniforms.numColumns), f32(uniforms.numRows) ); position = 1.0 - position * 2.0; position = position * cameraUniforms.screenSize; return VertexOutput( vec4(position, 1.0, 1.0), cornerPosition ); } // Fragment shader [[stage(fragment)]] fn fragMain([[location(0)]] UV:vec2) -> [[location(0)]] vec4 { var msdf:vec4 = textureSample(msdfTexture, msdfSampler, UV / f32(msdfUniforms.numColumns)); // msdf.b = msdf.b * (sin(f32(timeUniforms.now) / 1000.0 * TWO_PI) * 0.5 + 0.5); msdf.b = msdf.b * f32(timeUniforms.frame / 60 % 2); var now = timeUniforms.now; return msdf; }