@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
86 lines (80 loc) • 3.34 kB
text/typescript
import {MeshPhongMaterial, WebGLRenderTarget, Texture} from 'three';
// export const UV_LIGHT_MAP_FLIPPED_ATTRIB_NAME = 'uvLightmapFlipped';
export const DEFAULT_UV_LIGHT_MAP_ATTRIB_NAME = 'uvLightMap';
export interface LightMapMaterial extends MeshPhongMaterial {
uniforms: {
previousLightMap: {value: Texture | null};
lightMapMult: {value: number};
// flipped: {value: boolean};
};
}
export interface LightMapMatOptions {
lightMap: WebGLRenderTarget;
// uv: string;
// lightMapMult: number;
}
export function setLightMapMaterial(mat: LightMapMaterial, options: LightMapMatOptions) {
mat.uniforms.previousLightMap.value = options.lightMap.texture;
// mat.customProgramCacheKey = ()=> options.uv
// mat.uniforms.lightMapMult.value = options.lightMapMult;
}
export function createLightMapMaterial() {
const mat = new MeshPhongMaterial() as LightMapMaterial;
mat.uniforms = {
previousLightMap: {value: null},
// iterationBlend: {value: DEFAULT_ITERATION_BLEND},
lightMapMult: {value: 1},
// flipped: {value: false},
};
// mat.transparent = true;
// mat.blending = AdditiveBlending;
// mat.alphaTest = 0.5;
mat.name = 'lightMapMaterial';
mat.onBeforeCompile = (shader) => {
// Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions
shader.vertexShader = `
attribute vec2 LIGHTMAP_UV;
varying vec2 vUvLightMap;
// varying float vUvLightMapFlipped;
${shader.vertexShader.slice(0, -2)}
vUvLightMap = LIGHTMAP_UV;
gl_Position = vec4((LIGHTMAP_UV - 0.5) * 2.0, 1.0, 1.0);
}`;
// Fragment Shader: Set Pixels to average in the Previous frame's Shadows
const bodyStart = shader.fragmentShader.indexOf('void main() {');
shader.fragmentShader = `
varying vec2 vUvLightMap;
// varying float vUvLightMapFlipped;
${shader.fragmentShader.slice(0, bodyStart)}
uniform sampler2D previousLightMap;
// uniform float iterationBlend;
uniform float lightMapMult;
// uniform bool flipped;
${shader.fragmentShader.slice(bodyStart - 1, -2)}
vec3 texelOld = texture2D(previousLightMap, vUvLightMap).rgb;
// gl_FragColor.rgb = gl_FragColor.rgb + texelOld / totalIterationsCount;
// gl_FragColor.a = flipped ? vUvLightMapFlipped : 1.-vUvLightMapFlipped;
gl_FragColor.rgb = texelOld + gl_FragColor.rgb * lightMapMult;// * gl_FragColor.a;
// gl_FragColor.a = lightMapMult;
// gl_FragColor.rgb = mix(texelOld, gl_FragColor.rgb, iterationBlend);
// gl_FragColor.rgb = vec3(vUvLightMap);
}
`;
// Set the Previous Frame's Texture Buffer and Averaging Window
// const uniforms = {
// previousShadowMap: {value: renderTarget.texture}, //this.progressiveLightMap1.texture},
// iterationBlend: {value: DEFAULT_ITERATION_BLEND},
// };
shader.uniforms.previousLightMap = mat.uniforms.previousLightMap; //{value: renderTarget.texture}; //uniforms.previousShadowMap;
shader.uniforms.lightMapMult = mat.uniforms.lightMapMult; //{value: 0};
// shader.uniforms.flipped = mat.uniforms.flipped;
// shader.uniforms.iterationBlend = uniforms.iterationBlend;
// mat.uniforms = shader.uniforms as any;
// mat.uniforms.previousShadowMap = uniforms.previousShadowMap;
// mat.uniforms.iterationBlend = uniforms.iterationBlend;
// Set the new Shader to this
mat.userData.shader = shader;
};
return mat;
}