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
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 };
|
|
} |