Security News
Weekly Downloads Now Available in npm Package Search Results
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
screen-space-reflections
Advanced tools
Implements performant Screen Space Reflections in three.js.
react-three-fiber demos:
If you are using react-three-fiber, you can also use the SSR
component from react-postprocessing. Check out the react-three-fiber demos to see how it's used there.
Install the package first:
npm i screen-space-reflections
Then add it to your code like so:
import { SSREffect } from "screen-space-reflections"
const composer = new POSTPROCESSING.EffectComposer(renderer)
const ssrEffect = new SSREffect(scene, camera, options?)
const ssrPass = new POSTPROCESSING.EffectPass(camera, ssrEffect)
composer.addPass(ssrPass)
const options = {
temporalResolve: true,
temporalResolveMix: 0.9,
temporalResolveCorrection: 1,
resolutionScale: 1,
velocityResolutionScale: 1,
width: typeof window !== "undefined" ? window.innerWidth : 1000,
height: typeof window !== "undefined" ? window.innerHeight : 1000,
blurMix: 0.5,
blurSharpness: 10,
blurKernelSize: 1,
rayDistance: 10,
intensity: 1,
colorExponent: 1,
maxRoughness: 1,
jitter: 0,
jitterSpread: 0,
jitterRough: 0,
roughnessFadeOut: 1,
rayFadeOut: 0,
MAX_STEPS: 20,
NUM_BINARY_SEARCH_STEPS: 5,
maxDepthDifference: 10,
thickness: 10,
ior: 1.45,
CLAMP_RADIUS: 1,
ALLOW_MISSED_RAYS: true,
USE_MRT: true,
USE_NORMALMAP: true,
USE_ROUGHNESSMAP: true
}
Name | Type | Description | |
---|---|---|---|
temporalResolve | boolean | whether you want to use Temporal Resolving to re-use reflections from the last frames; this will reduce noise tremendously but may result in "smearing" | |
resolutionScale | Number | resolution of the SSR effect, a resolution of 0.5 means the effect will be rendered at half resolution | |
velocityResolutionScale | Number | resolution of the velocity buffer, a resolution of 0.5 means velocity will be rendered at half resolution | |
width | Number | width of the SSREffect | |
height | Number | height of the SSREffect | |
blurMix | Number | how much the blurred reflections should be mixed with the raw reflections | |
blurSharpness | Number | exponent of the Box Blur filter; higher values will result in more sharpness | |
blurKernelSize | Number | kernel size of the Box Blur Filter; higher kernel sizes will result in blurrier reflections with more artifacts | |
rayDistance | Number | maximum distance a reflection ray can travel to find what it reflects | |
intensity | Number | intensity of the reflections | |
colorExponent | Number | exponent by which reflections will be potentiated when composing the current frame's reflections and the accumulated reflections into a final reflection; higher values will make reflections clearer by highlighting darker spots less | |
maxRoughness | Number | maximum roughness a texel can have to have reflections calculated for it | |
jitter | Number | how intense jittering should be | |
jitterSpread | Number | how much the jittered rays should be spread; higher values will give a rougher look regarding the reflections but are more expensive to compute with | |
jitterRough | Number | how intense jittering should be in relation to a material's roughness | |
roughnessFadeOut | Number | how intense reflections should be on rough spots; a higher value will make reflections fade out quicker on rough spots | |
rayFadeOut | Number | how much reflections will fade out by distance | |
MAX_STEPS | Number | number of steps a reflection ray can maximally do to find an object it intersected (and thus reflects) | |
NUM_BINARY_SEARCH_STEPS | Number | once we had our ray intersect something, we need to find the exact point in space it intersected and thus it reflects; this can be done through binary search with the given number of maximum steps | |
maxDepthDifference | Number | maximum depth difference between a ray and the particular depth at its screen position after refining with binary search; higher values will result in better performance | |
thickness | Number | maximum depth difference between a ray and the particular depth at its screen position before refining with binary search; higher values will result in better performance | |
ior | Number | Index of Refraction, used for calculating fresnel; reflections tend to be more intense the steeper the angle between them and the viewer is, the ior parameter sets how much the intensity varies | |
CLAMP_RADIUS | boolean | how many surrounding pixels will be used for neighborhood clamping; a higher value can reduce noise when moving the camera but will result in less performance | |
ALLOW_MISSED_RAYS | boolean | if there should still be reflections for rays for which a reflecting point couldn't be found; enabling this will result in stretched looking reflections which can look good or bad depending on the angle | |
USE_MRT | boolean | WebGL2 only - whether to use multiple render targets when rendering the G-buffers (normals, depth and roughness); using them can improve performance as they will render all information to multiple buffers for each fragment in one run; this setting can't be changed during run-time | |
USE_NORMALMAP | boolean | if roughness maps should be taken account of when calculating reflections | |
USE_ROUGHNESSMAP | boolean | if normal maps should be taken account of when calculating reflections |
Since the right options for an SSR effect depend a lot on the scene, it can happen that you don't seem to have an effect at all in your scene when you use the SSR effect for the first time in it without any configuration. This can have multiple causes such as rayDistance
being way too low for your scene for example. So to find out which SSR options are right for your scene, you should use a GUI to find the right values easily.
The example already comes with a simple one-file GUI SSRDebugGUI.js
that you can use in your project like so:
npm i tweakpane
SSRDebugGUI.js
to your project and initialize it like so in your scene:import { SSRDebugGUI } from "./SSRDebugGUI"
const gui = new SSRDebugGUI(ssrEffect, options)
That's it, you should now have the GUI you can see in the example scene. The options
parameter is optional for the SSRDebugGUI and will default to the default options if no options
parameter is given.
If you'd like to test this project and run it locally, run these commands:
git clone https://github.com/0beqz/screen-space-reflections
cd screen-space-reflections/example
npm i --force
npm run dev
thickness
, ior
, rayDistance
,...) reactive so that you now just need to set ssrEffect.rayDistance = value
for example to update valuesIf you are getting artifacts, for example:
Then try the following:
thickness
maxDepthDifference
rayDistance
and increase MAX_STEPS
if reflections are cutting off nowNUM_BINARY_SEARCH_STEPS
Keep in mind that increasing these values will have an impact on performance.
Since SSR only works with screen-space information, there'll be artifacts when there's no scene information for a reflection ray.
This usually happens when another objects occludes a reflecting object behind it.
To make missing reflections less apparent, use an env-map that can then be used as a fallback when there is no reflection.
Ideally use a box-projected env-map.
Here are two implementations for three.js and react-three-fiber:
By default, the SSR effect won't really update reflections if the camera is not moving and no mesh in the view is moving.
However, it will check if a mesh's material's map is a VideoTexture
and will keep its reflections updated each frame.
If your material is not using a VideoTexture
but is still animated (e.g. it's a custom animated shader material), then you can get updated reflections for it by setting
mesh.material.userData.needsUpdatedReflections = true
. This will make the SSR effect recalculate its reflections each frame.
window
being undefinedIf you are using Server Side Rendering and don't have access to the window
object then the SSR effect won't be able to set the correct width and height for its passes.
So once you have access to the window
object, set the correct width and height of the SSR effect using:
ssrEffect.setSize(window.innerWidth, window.innerHeight)
Edge fade for SSR: kode80
Velocity Shader: three.js sandbox
Box Blur filter: glfx.js
Video texture: Uzunov Rostislav
FAQs
Screen Space Reflections implementation in three.js
The npm package screen-space-reflections receives a total of 6,561 weekly downloads. As such, screen-space-reflections popularity was classified as popular.
We found that screen-space-reflections demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.
Security News
A Stanford study reveals 9.5% of engineers contribute almost nothing, costing tech $90B annually, with remote work fueling the rise of "ghost engineers."
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.