You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.3 KiB
TypeScript

import * as THREE from 'three';
import gradientFragmentShader from './gradient.fragmentShader.glsl?raw';
import gradientVertexShader from './gradient.vertexShader.glsl?raw';
function getMaterial() {
var uniforms = {
uTime: {
value: 0,
},
};
var material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: gradientVertexShader,
fragmentShader: gradientFragmentShader,
//wireframe: true,
});
return material;
}
export function initGradient(
scene: THREE.Scene,
renderer: THREE.WebGLRenderer
) {
const quality = 0.02;
const material = getMaterial();
const plane = new THREE.Mesh(new THREE.PlaneGeometry(), material);
scene.add(plane);
const render = (elapsed: number, delta: number) => {
material.uniforms.uTime.value = elapsed;
};
const updateSize = () => {
const viewportSize = renderer.getSize(new THREE.Vector2());
plane.geometry.dispose();
plane.geometry = new THREE.PlaneGeometry(
viewportSize.width,
viewportSize.height * 4,
viewportSize.width * quality,
viewportSize.height * 4 * quality
);
};
updateSize();
const unload = () => {
scene.remove(plane);
plane.geometry.dispose();
material.dispose();
};
return { render, updateSize, unload };
}