diff options
| author | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-09-22 19:00:47 +0900 |
|---|---|---|
| committer | syuilo <4439005+syuilo@users.noreply.github.com> | 2025-09-22 19:00:47 +0900 |
| commit | 13d5c6d2b21565490fa5a43aee6fd9e373d90cd2 (patch) | |
| tree | 93deb2e8bb8906be40855debb5b4f0bf7dc1eff4 | |
| parent | update pnpm (diff) | |
| download | misskey-13d5c6d2b21565490fa5a43aee6fd9e373d90cd2.tar.gz misskey-13d5c6d2b21565490fa5a43aee6fd9e373d90cd2.tar.bz2 misskey-13d5c6d2b21565490fa5a43aee6fd9e373d90cd2.zip | |
refactor MkAnimBg
| -rw-r--r-- | packages/frontend/src/components/MkAnimBg.vue | 76 |
1 files changed, 17 insertions, 59 deletions
diff --git a/packages/frontend/src/components/MkAnimBg.vue b/packages/frontend/src/components/MkAnimBg.vue index 19a21f6e24..0e1018dcbf 100644 --- a/packages/frontend/src/components/MkAnimBg.vue +++ b/packages/frontend/src/components/MkAnimBg.vue @@ -10,6 +10,7 @@ SPDX-License-Identifier: AGPL-3.0-only <script lang="ts" setup> import { onMounted, onUnmounted, useTemplateRef } from 'vue'; import isChromatic from 'chromatic/isChromatic'; +import { initShaderProgram } from '@/utility/webgl.js'; const canvasEl = useTemplateRef('canvasEl'); @@ -21,47 +22,6 @@ const props = withDefaults(defineProps<{ focus: 1.0, }); -function loadShader(gl: WebGLRenderingContext, type: number, source: string) { - const shader = gl.createShader(type); - if (shader == null) return null; - - gl.shaderSource(shader, source); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - alert( - `falied to compile shader: ${gl.getShaderInfoLog(shader)}`, - ); - gl.deleteShader(shader); - return null; - } - - return shader; -} - -function initShaderProgram(gl: WebGLRenderingContext, vsSource: string, fsSource: string) { - const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource); - const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource); - - const shaderProgram = gl.createProgram(); - if (vertexShader == null || fragmentShader == null) return null; - - gl.attachShader(shaderProgram, vertexShader); - gl.attachShader(shaderProgram, fragmentShader); - gl.linkProgram(shaderProgram); - - if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { - alert( - `failed to init shader: ${gl.getProgramInfoLog( - shaderProgram, - )}`, - ); - return null; - } - - return shaderProgram; -} - let handle: ReturnType<typeof window['requestAnimationFrame']> | null = null; onMounted(() => { @@ -71,7 +31,7 @@ onMounted(() => { canvas.width = width; canvas.height = height; - const maybeGl = canvas.getContext('webgl', { premultipliedAlpha: true }); + const maybeGl = canvas.getContext('webgl2', { premultipliedAlpha: true }); if (maybeGl == null) return; const gl = maybeGl; @@ -82,18 +42,16 @@ onMounted(() => { const positionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); - const shaderProgram = initShaderProgram(gl, ` - attribute vec2 vertex; - + const shaderProgram = initShaderProgram(gl, `#version 300 es + in vec2 position; uniform vec2 u_scale; - - varying vec2 v_pos; + out vec2 in_uv; void main() { - gl_Position = vec4(vertex, 0.0, 1.0); - v_pos = vertex / u_scale; + gl_Position = vec4(position, 0.0, 1.0); + in_uv = position / u_scale; } - `, ` + `, `#version 300 es precision mediump float; vec3 mod289(vec3 x) { @@ -143,6 +101,7 @@ onMounted(() => { return 130.0 * dot(m, g); } + in vec2 in_uv; uniform float u_time; uniform vec2 u_resolution; uniform float u_spread; @@ -150,8 +109,7 @@ onMounted(() => { uniform float u_warp; uniform float u_focus; uniform float u_itensity; - - varying vec2 v_pos; + out vec4 out_color; float circle( in vec2 _pos, in vec2 _origin, in float _radius ) { float SPREAD = 0.7 * u_spread; @@ -182,13 +140,13 @@ onMounted(() => { float ratio = u_resolution.x / u_resolution.y; - vec2 uv = vec2( v_pos.x, v_pos.y / ratio ) * 0.5 + 0.5; + vec2 uv = vec2( in_uv.x, in_uv.y / ratio ) * 0.5 + 0.5; vec3 color = vec3( 0.0 ); - float greenMix = snoise( v_pos * 1.31 + u_time * 0.8 * 0.00017 ) * 0.5 + 0.5; - float purpleMix = snoise( v_pos * 1.26 + u_time * 0.8 * -0.0001 ) * 0.5 + 0.5; - float orangeMix = snoise( v_pos * 1.34 + u_time * 0.8 * 0.00015 ) * 0.5 + 0.5; + float greenMix = snoise( in_uv * 1.31 + u_time * 0.8 * 0.00017 ) * 0.5 + 0.5; + float purpleMix = snoise( in_uv * 1.26 + u_time * 0.8 * -0.0001 ) * 0.5 + 0.5; + float orangeMix = snoise( in_uv * 1.34 + u_time * 0.8 * 0.00015 ) * 0.5 + 0.5; float alphaOne = 0.35 + 0.65 * pow( snoise( vec2( u_time * 0.00012, uv.x ) ) * 0.5 + 0.5, 1.2 ); float alphaTwo = 0.35 + 0.65 * pow( snoise( vec2( ( u_time + 1561.0 ) * 0.00014, uv.x ) ) * 0.5 + 0.5, 1.2 ); @@ -198,10 +156,10 @@ onMounted(() => { color += vec3( circle( uv, vec2( 0.90 + cos( u_time * 0.000166 ) * 0.06, 0.42 + sin( u_time * 0.000138 ) * 0.06 ), 0.18 ) ) * alphaTwo * ( green * greenMix + purple * purpleMix ); color += vec3( circle( uv, vec2( 0.19 + sin( u_time * 0.000112 ) * 0.06, 0.25 + sin( u_time * 0.000192 ) * 0.06 ), 0.09 ) ) * alphaThree * ( orange * orangeMix ); - color *= u_itensity + 1.0 * pow( snoise( vec2( v_pos.y + u_time * 0.00013, v_pos.x + u_time * -0.00009 ) ) * 0.5 + 0.5, 2.0 ); + color *= u_itensity + 1.0 * pow( snoise( vec2( in_uv.y + u_time * 0.00013, in_uv.x + u_time * -0.00009 ) ) * 0.5 + 0.5, 2.0 ); vec3 inverted = vec3( 1.0 ) - color; - gl_FragColor = vec4( color, max(max(color.x, color.y), color.z) ); + out_color = vec4(color, max(max(color.x, color.y), color.z)); } `); if (shaderProgram == null) return; @@ -223,7 +181,7 @@ onMounted(() => { gl.uniform1f(u_itensity, 0.5); gl.uniform2fv(u_scale, [props.scale, props.scale]); - const vertex = gl.getAttribLocation(shaderProgram, 'vertex'); + const vertex = gl.getAttribLocation(shaderProgram, 'position'); gl.enableVertexAttribArray(vertex); gl.vertexAttribPointer(vertex, 2, gl.FLOAT, false, 0, 0); |