Skip to content

Shaders

The @strata-game-library/shaders package provides a standalone collection of GLSL shaders that work with any Three.js project—no Strata dependency required.

Terminal window
npm install @strata-game-library/shaders
# or
pnpm add @strata-game-library/shaders
import { waterVertexShader, waterFragmentShader } from '@strata-game-library/shaders';
import * as THREE from 'three';
const material = new THREE.ShaderMaterial({
vertexShader: waterVertexShader,
fragmentShader: waterFragmentShader,
uniforms: {
uTime: { value: 0 },
uWaterColor: { value: new THREE.Color(0x0077be) },
}
});
ShaderDescription
terrainVertexShaderHeight-based vertex displacement
terrainFragmentShaderMulti-texture blending with triplanar mapping
ShaderDescription
waterVertexShaderBasic wave animation
waterFragmentShaderFresnel reflections, transparency
advancedWaterVertexShaderGerstner wave simulation
advancedWaterFragmentShaderReflections, refractions, caustics, foam
ShaderDescription
skyVertexShaderSky dome vertex shader
skyFragmentShaderRayleigh/Mie scattering, sun rendering
atmosphereVertexShaderAtmospheric scattering vertex
atmosphereFragmentShaderPhysically-based atmosphere
ShaderDescription
cloudLayerVertexShader2D cloud layer positioning
cloudLayerFragmentShaderProcedural cloud patterns
volumetricCloudVertexShader3D cloud ray marching setup
volumetricCloudFragmentShaderVolumetric cloud rendering
ShaderDescription
volumetricFogShaderDistance and height-based fog
underwaterShaderUnderwater overlay with caustics
godRaysVertexShaderLight shaft positioning
godRaysFragmentShaderVolumetric god rays
ShaderDescription
toonVertexShader / toonFragmentShaderCel-shading / cartoon style
hologramVertexShader / hologramFragmentShaderHolographic effect
dissolveVertexShader / dissolveFragmentShaderDissolve transition
forcefieldVertexShader / forcefieldFragmentShaderEnergy shield effect
glitchVertexShader / glitchFragmentShaderDigital glitch effect
ShaderDescription
grassWindVertexShaderWind animation for grass instances
treeWindVertexShaderWind animation for tree instances
import { waterVertexShader, waterFragmentShader } from '@strata-game-library/shaders';
const waterMaterial = new THREE.ShaderMaterial({
vertexShader: waterVertexShader,
fragmentShader: waterFragmentShader,
uniforms: {
uTime: { value: 0 },
uWaterColor: { value: new THREE.Color(0x0077be) },
uWaveHeight: { value: 0.5 },
uWaveSpeed: { value: 1.0 },
uOpacity: { value: 0.8 },
},
transparent: true,
});
// Update in render loop
function animate() {
waterMaterial.uniforms.uTime.value += 0.016;
requestAnimationFrame(animate);
}
import { skyVertexShader, skyFragmentShader } from '@strata-game-library/shaders';
const skyMaterial = new THREE.ShaderMaterial({
vertexShader: skyVertexShader,
fragmentShader: skyFragmentShader,
uniforms: {
sunPosition: { value: new THREE.Vector3(100, 50, 100) },
turbidity: { value: 10 },
rayleigh: { value: 2 },
mieCoefficient: { value: 0.005 },
mieDirectionalG: { value: 0.8 },
},
side: THREE.BackSide,
});
const sky = new THREE.Mesh(
new THREE.SphereGeometry(1000, 32, 32),
skyMaterial
);
import { volumetricFogShader } from '@strata-game-library/shaders';
const fogMaterial = new THREE.ShaderMaterial({
vertexShader: volumetricFogShader.vertex,
fragmentShader: volumetricFogShader.fragment,
uniforms: {
uDensity: { value: 0.02 },
uColor: { value: new THREE.Color(0x8899aa) },
uCameraPos: { value: camera.position },
},
transparent: true,
depthWrite: false,
});

Reusable GLSL code chunks:

import { noiseChunk, fbmChunk, sdfChunk } from '@strata-game-library/shaders/chunks';
// Use in custom shaders
const customFragment = `
${noiseChunk}
${fbmChunk}
void main() {
float n = fbm(vPosition * 0.1);
gl_FragColor = vec4(vec3(n), 1.0);
}
`;

Full TypeScript definitions included:

import type { ShaderUniforms, WaterUniforms, SkyUniforms } from '@strata-game-library/shaders';
const uniforms: WaterUniforms = {
uTime: { value: 0 },
uWaterColor: { value: new THREE.Color(0x0077be) },
uWaveHeight: { value: 0.5 },
// TypeScript will catch any missing or incorrect uniforms
};