Three.js Transmission Glass
Realistic 3D glass torus using Three.js MeshTransmissionMaterial with refraction, chromatic aberration, and organic distortion. Built with @react-three/fiber and @react-three/drei.
Preview
Loading preview…
Customize
IOR1.5
Thickness0.5
Chromatic0.06
"use client";
import { useRef } from "react";
import { Canvas, useFrame } from "@react-three/fiber";
import { MeshTransmissionMaterial, Environment } from "@react-three/drei";
import type * as THREE from "three";
type GlassMeshProps = {
ior: number;
thickness: number;
chromaticAberration: number;
};
function GlassMesh({ ior, thickness, chromaticAberration }: GlassMeshProps) {
const meshRef = useRef<THREE.Mesh>(null);
useFrame((_state, delta) => {
if (meshRef.current) {
meshRef.current.rotation.y += delta * 0.3;
meshRef.current.rotation.x += delta * 0.1;
}
});
return (
<mesh ref={meshRef}>
<torusGeometry args={[1, 0.4, 64, 128]} />
<MeshTransmissionMaterial
transmission={1}
roughness={0}
ior={ior}
thickness={thickness}
chromaticAberration={chromaticAberration}
anisotropy={0.2}
distortion={0.5}
distortionScale={0.3}
temporalDistortion={0.2}
backside
backsideThickness={0.3}
samples={6}
resolution={256}
/>
</mesh>
);
}
type TransmissionGlassProps = {
ior?: number;
thickness?: number;
chromaticAberration?: number;
className?: string;
};
export default function TransmissionGlass({
ior = 1.5,
thickness = 0.5,
chromaticAberration = 0.06,
className,
}: TransmissionGlassProps) {
return (
<div className={className} style={{ width: "100%", height: "100%" }}>
<Canvas camera={{ position: [0, 0, 4], fov: 45 }} dpr={[1, 1.5]} gl={{ antialias: true, alpha: true }} style={{ background: "transparent" }}>
<ambientLight intensity={0.5} />
<directionalLight position={[5, 5, 5]} intensity={1} />
<GlassMesh ior={ior} thickness={thickness} chromaticAberration={chromaticAberration} />
<Environment preset="city" />
</Canvas>
</div>
);
}