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.

46 lines
1.2 KiB
TypeScript

import * as THREE from 'three';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass';
import { GrainShader } from './grainPostprocessingShader';
export function initGrainFilter(
renderer: THREE.WebGLRenderer,
scene: THREE.Scene,
camera: THREE.OrthographicCamera
) {
const width = window.innerWidth || 2;
const height = window.innerHeight || 2;
const effectFilm = new ShaderPass(GrainShader);
const rtParameters = {
stencilBuffer: true,
};
const renderScenePass = new RenderPass(scene, camera);
let composer2 = new EffectComposer(
renderer,
new THREE.WebGLRenderTarget(width, height, rtParameters)
);
composer2.setPixelRatio(window.devicePixelRatio);
composer2.addPass(renderScenePass);
composer2.addPass(effectFilm);
return {
render: (elapsed: number, delta: number) => {
composer2.render(delta);
effectFilm.uniforms['uTime'].value = elapsed;
},
resize: () => {
const viewportSize = renderer.getSize(new THREE.Vector2());
composer2.setSize(viewportSize.width, viewportSize.height);
},
};
}