threlte logo
@threlte/extras

<FakeGlowMaterial>

webgl <FakeGlowMaterial> works with WebGL only.

This component is a port of ektogamat’s <FakeGlowMaterial> r3f component which displays a glowing outline around a mesh using a custom shader, instead of post-processing.

<script lang="ts">
  import { Canvas } from '@threlte/core'
  import Scene from './Scene.svelte'
</script>

<div>
  <Canvas>
    <Scene />
  </Canvas>
</div>

<style>
  div {
    height: 100%;
  }
</style>
<script lang="ts">
  import { T } from '@threlte/core'
  import { OrbitControls, Grid, FakeGlowMaterial } from '@threlte/extras'
</script>

<T.Group
  position.y={2}
  position.x={-3}
>
  <T.Mesh>
    <T.MeshBasicMaterial color="green" />
    <T.IcosahedronGeometry args={[2, 4]} />
  </T.Mesh>

  <T.Mesh>
    <FakeGlowMaterial />
    <T.IcosahedronGeometry args={[4, 4]} />
  </T.Mesh>
</T.Group>

<T.Group
  position.y={3}
  position.x={3}
>
  <T.Mesh>
    <T.MeshBasicMaterial color="blue" />
    <T.BoxGeometry args={[2, 2, 2]} />
  </T.Mesh>

  <T.Mesh>
    <FakeGlowMaterial glowColor="blue" />
    <T.IcosahedronGeometry args={[3, 4]} />
  </T.Mesh>
</T.Group>

<T.Group
  position.y={6}
  position.x={0}
>
  <T.Mesh>
    <T.MeshBasicMaterial color="red" />
    <T.TorusKnotGeometry args={[1, 0.25, 128]} />
  </T.Mesh>

  <T.Mesh>
    <FakeGlowMaterial glowColor="red" />
    <T.TorusKnotGeometry args={[1, 0.8, 128]} />
  </T.Mesh>
</T.Group>

<T.PerspectiveCamera
  makeDefault
  position.y={8}
  position.z={8}
  fov={90}
>
  <OrbitControls
    enableDamping
    enablePan={false}
    enableZoom={false}
  />
</T.PerspectiveCamera>

<Grid
  position.y={0}
  sectionThickness={1}
  infiniteGrid
  cellColor="#dddddd"
  sectionColor="#ffffff"
  sectionSize={10}
  cellSize={2}
/>

Examples

Basic Example

FakeGlowMaterial.svelte
<script lang="ts">
  import { T } from '@threlte/core'
  import { FakeGlowMaterial } from '@threlte/extras'
</script>

<T.Mesh>
  <FakeGlowMaterial glowColor="red" />
  <T.IcosahedronGeometry args={[4, 4]} />
</T.Mesh>

This effect is mesh based, meaning you need to provide a mesh for this to work properly. The mesh must also be smooth enough that glsl can calculate the normals properly.

For sharp meshes like a cube, you can use a sphere to simulate the glow, instead of a copy of the cube.

FakeGlowMaterialCube.svelte
<script lang="ts">
  import { T } from '@threlte/core'
  import { FakeGlowMaterial } from '@threlte/extras'
</script>

<T.Mesh>
  <FakeGlowMaterial glowColor="blue" />
  <T.BoxGeometry args={[2, 2, 2]} />
</T.Mesh>

<T.Mesh>
  <FakeGlowMaterial glowColor="blue" />
  <T.IcosahedronGeometry args={[3, 4]} />
</T.Mesh>

Component Signature

<FakeGlowMaterial> extends < T . ShaderMaterial > and supports all its props, snippets, bindings and events.

Props

name
type
required
default
description

falloff
number
no
0.1
How softly the glow fades out toward the silhouette, from 0 (hard edge) to 1 (soft edge).

glowColor
ColorRepresentation
no
'green'
The color of the glow.

glowInternalRadius
number
no
6
Pushes the glow out toward the silhouette. Higher values leave the center of the mesh clear and concentrate the glow at its edges, for a fresnel look.

glowSharpness
number
no
1
How opaque and intense the glow is.