A simple to use holographic material for threejs
Live link: https://threejs-holographic-material.vercel.app/
Code Sandbox example: https://codesandbox.io/p/sandbox/holographic-material-for-react-three-fiber-rpjgps
Code Sandbox simplest example: https://codesandbox.io/p/devbox/holographic-material-for-react-three-fiber-simple-example-hq24t2
Dive into a world of mesmerizing holographic wonders with the HolographicMaterial for React Three Fiber. This enchanting React component brings your virtual reality experiences to life, infusing them with a burst of vibrant colors, dynamic scanlines, and a touch of futuristic brilliance.
While this component operates independently of any post-processing, it achieves an enhanced visual appeal when coupled with bloom effects. The utilization of bloom proves particularly effective in rendering a captivating glow effect, especially in areas where overexposure is prevalent.
Create a new file with the contents of this gist on your project.
import HolographicMaterial from "./HolographicMaterial";
...
<mesh>
<sphereGeometry />
<HolographicMaterial />
</mesh>
...
That's all that you need to use this component. Of course you can customize it as shown bellow.
Name | Type | Default | Description |
---|---|---|---|
fresnelAmount | Number | 0.45 | Controls the value of the Fresnel effect. Ranges from 0.0 to 1.0. |
fresnelOpacity | Number | 1.0 | Controls the opacity of the Fresnel effect. Ranges from 0.0 to 1.0. |
scanlineSize | Number | 8.0 | Controls the size of the scanlines. Ranges from 1 to 15. |
hologramBrightness | Number | 1.2 | Controls the brightness of the hologram. Ranges from 0.0 to 2.0. |
signalSpeed | Number | 0.45 | Controls the speed of the signal effect. Ranges from 0.0 to 2.0. |
hologramColor | String | "#51a4de" | Specifies the color of the hologram. Use hexadecimal format. |
enableBlinking | Boolean | true | Enables or disables the blinking effect. Defaults to true. |
hologramOpacity | Number | 1.0 | Specifies the opacity of the hologram. Defaults to 1.0. |
enableBlinking | Boolean | true | Enables or disables the blinking effect. Defaults to true. |
blinkFresnelOnly | Boolean | true | Enables or disables the blinking effect for the Fresnel only. Defaults to true. |
side | String | "FrontSide" | Specifies side for the material, as String. Options are "FrontSide", "BackSide", "DoubleSide". Defaults to "FrontSide". |
Here is an example of how you can pass these props. If you pass any of those props, the default values will be overwritten.
<HolographicMaterial
fresnelAmount={0.2}
fresnelOpacity={0.15}
hologramBrightness={0.7}
scanlineSize={6}
signalSpeed={2.3}
hologramColor={"#ff0000"}
hologramOpacity={1.0}
blinkFresnelOnly={true}
enableBlinking={true}
enableAdditive={true}
side={"FrontSide"}
/>
You can also use LEVA to create a panel, like in the demo, so you can tweak the parameters live.
const holographicControls = useControls({
fresnelAmount: { value: 0.45, min: 0.0, max: 1.0},
fresnelOpacity: { value: 1.0,min: 0.0, max: 1.0},
scanlineSize: { value: 8.0, min: 1.0, max: 15},
hologramBrightness: { value: 1.2, min: 0.0, max: 2},
signalSpeed: { value: 0.45, min: 0.0, max: 2},
hologramOpacity: { value: 1.0, min: 0.0, max: 1.0},
hologramColor: { value: "#51a4de"},
enableBlinking: true,
blinkFresnelOnly: true,
enableAdditive: true,
side: { options: ["FrontSide", "BackSide", "DoubleSide"] },
});
Then you can just spread this object to use it in HolographicMaterial
<HolographicMaterial {...holographicControls} />
Here you can see a video with it in action and some options
- Adding an optional glitch effect
- Adding support for a vertex shader distortion glitch
- Adding support for video textures to be mapped as planes
- Convert the shader into a texture on runtime for better performance
This component is an open-source creation released under the (MIT) license. While you're free to integrate and innovate with it, I would genuinely appreciate knowing when this HolographicMaterial component sparks creativity in your projects!
Resources: Threejs, WebGL, React Three Fiber, React three post processing
Would be really appreciated if you are willing to give me a star here on GitHub 🎉 or buy me a coffee ☕ https://www.buymeacoffee.com/andersonmancini. The money will be used to produce more content about threejs or to buy new courses.