Install
Terminal · npx$
npx skills add https://github.com/cloudai-x/threejs-skills --skill threejs-materialsWorks with Paperclip
How Threejs Materials fits into a Paperclip company.
Threejs Materials drops into any Paperclip agent that handles this kind of work. Assign it to a specialist inside a pre-configured PaperclipOrg company and the skill becomes available on every heartbeat — no prompt engineering, no tool wiring.
S
SaaS FactoryPaired
Pre-configured AI company — 18 agents, 18 skills, one-time purchase.
$27$59
Explore packSource file
SKILL.md520 linesExpandCollapse
---name: threejs-materialsdescription: Three.js materials - PBR, basic, phong, shader materials, material properties. Use when styling meshes, working with textures, creating custom shaders, or optimizing material performance.--- # Three.js Materials ## Quick Start ```javascriptimport * as THREE from "three"; // PBR material (recommended for realistic rendering)const material = new THREE.MeshStandardMaterial({ color: 0x00ff00, roughness: 0.5, metalness: 0.5,}); const mesh = new THREE.Mesh(geometry, material);``` ## Material Types Overview | Material | Use Case | Lighting || -------------------- | ------------------------------------- | ------------------ || MeshBasicMaterial | Unlit, flat colors, wireframes | No || MeshLambertMaterial | Matte surfaces, performance | Yes (diffuse only) || MeshPhongMaterial | Shiny surfaces, specular highlights | Yes || MeshStandardMaterial | PBR, realistic materials | Yes (PBR) || MeshPhysicalMaterial | Advanced PBR, clearcoat, transmission | Yes (PBR+) || MeshToonMaterial | Cel-shaded, cartoon look | Yes (toon) || MeshNormalMaterial | Debug normals | No || MeshDepthMaterial | Depth visualization | No || ShaderMaterial | Custom GLSL shaders | Custom || RawShaderMaterial | Full shader control | Custom | ## MeshBasicMaterial No lighting calculations. Fast, always visible. ```javascriptconst material = new THREE.MeshBasicMaterial({ color: 0xff0000, transparent: true, opacity: 0.5, side: THREE.DoubleSide, // FrontSide, BackSide, DoubleSide wireframe: false, map: texture, // Color/diffuse texture alphaMap: alphaTexture, // Transparency texture envMap: envTexture, // Reflection texture reflectivity: 1, // Env map intensity fog: true, // Affected by scene fog});``` ## MeshLambertMaterial Diffuse-only lighting. Fast, no specular highlights. ```javascriptconst material = new THREE.MeshLambertMaterial({ color: 0x00ff00, emissive: 0x111111, // Self-illumination color emissiveIntensity: 1, map: texture, emissiveMap: emissiveTexture, envMap: envTexture, reflectivity: 0.5,});``` ## MeshPhongMaterial Specular highlights. Good for shiny, plastic-like surfaces. ```javascriptconst material = new THREE.MeshPhongMaterial({ color: 0x0000ff, specular: 0xffffff, // Highlight color shininess: 100, // Highlight sharpness (0-1000) emissive: 0x000000, flatShading: false, // Flat vs smooth shading map: texture, specularMap: specTexture, // Per-pixel shininess normalMap: normalTexture, normalScale: new THREE.Vector2(1, 1), bumpMap: bumpTexture, bumpScale: 1, displacementMap: dispTexture, displacementScale: 1,});``` ## MeshStandardMaterial (PBR) Physically-based rendering. Recommended for realistic results. ```javascriptconst material = new THREE.MeshStandardMaterial({ color: 0xffffff, roughness: 0.5, // 0 = mirror, 1 = diffuse metalness: 0.0, // 0 = dielectric, 1 = metal // Textures map: colorTexture, // Albedo/base color roughnessMap: roughTexture, // Per-pixel roughness metalnessMap: metalTexture, // Per-pixel metalness normalMap: normalTexture, // Surface detail normalScale: new THREE.Vector2(1, 1), aoMap: aoTexture, // Ambient occlusion (uses uv2!) aoMapIntensity: 1, displacementMap: dispTexture, // Vertex displacement displacementScale: 0.1, displacementBias: 0, // Emissive emissive: 0x000000, emissiveIntensity: 1, emissiveMap: emissiveTexture, // Environment envMap: envTexture, envMapIntensity: 1, // Other flatShading: false, wireframe: false, fog: true,}); // Note: aoMap requires second UV channelgeometry.setAttribute("uv2", geometry.attributes.uv);``` ## MeshPhysicalMaterial (Advanced PBR) Extends MeshStandardMaterial with advanced features. ```javascriptconst material = new THREE.MeshPhysicalMaterial({ // All MeshStandardMaterial properties plus: // Clearcoat (car paint, lacquer) clearcoat: 1.0, // 0-1 clearcoat layer strength clearcoatRoughness: 0.1, clearcoatMap: ccTexture, clearcoatRoughnessMap: ccrTexture, clearcoatNormalMap: ccnTexture, clearcoatNormalScale: new THREE.Vector2(1, 1), // Transmission (glass, water) transmission: 1.0, // 0 = opaque, 1 = fully transparent transmissionMap: transTexture, thickness: 0.5, // Volume thickness for refraction thicknessMap: thickTexture, attenuationDistance: 1, // Absorption distance attenuationColor: new THREE.Color(0xffffff), // Refraction ior: 1.5, // Index of refraction (1-2.333) // Sheen (fabric, velvet) sheen: 1.0, sheenRoughness: 0.5, sheenColor: new THREE.Color(0xffffff), sheenColorMap: sheenTexture, sheenRoughnessMap: sheenRoughTexture, // Iridescence (soap bubbles, oil slicks) iridescence: 1.0, iridescenceIOR: 1.3, iridescenceThicknessRange: [100, 400], iridescenceMap: iridTexture, iridescenceThicknessMap: iridThickTexture, // Anisotropy (brushed metal) anisotropy: 1.0, anisotropyRotation: 0, anisotropyMap: anisoTexture, // Specular specularIntensity: 1, specularColor: new THREE.Color(0xffffff), specularIntensityMap: specIntTexture, specularColorMap: specColorTexture,});``` ### Glass Material Example ```javascriptconst glass = new THREE.MeshPhysicalMaterial({ color: 0xffffff, metalness: 0, roughness: 0, transmission: 1, thickness: 0.5, ior: 1.5, envMapIntensity: 1,});``` ### Car Paint Example ```javascriptconst carPaint = new THREE.MeshPhysicalMaterial({ color: 0xff0000, metalness: 0.9, roughness: 0.5, clearcoat: 1, clearcoatRoughness: 0.1,});``` ## MeshToonMaterial Cel-shaded cartoon look. ```javascriptconst material = new THREE.MeshToonMaterial({ color: 0x00ff00, gradientMap: gradientTexture, // Optional: custom shading gradient}); // Create step gradient textureconst colors = new Uint8Array([0, 128, 255]);const gradientMap = new THREE.DataTexture(colors, 3, 1, THREE.RedFormat);gradientMap.minFilter = THREE.NearestFilter;gradientMap.magFilter = THREE.NearestFilter;gradientMap.needsUpdate = true;``` ## MeshNormalMaterial Visualize surface normals. Useful for debugging. ```javascriptconst material = new THREE.MeshNormalMaterial({ flatShading: false, wireframe: false,});``` ## MeshDepthMaterial Render depth values. Used for shadow maps, DOF effects. ```javascriptconst material = new THREE.MeshDepthMaterial({ depthPacking: THREE.RGBADepthPacking,});``` ## PointsMaterial For point clouds. ```javascriptconst material = new THREE.PointsMaterial({ color: 0xffffff, size: 0.1, sizeAttenuation: true, // Scale with distance map: pointTexture, alphaMap: alphaTexture, transparent: true, alphaTest: 0.5, // Discard pixels below threshold vertexColors: true, // Use per-vertex colors}); const points = new THREE.Points(geometry, material);``` ## LineBasicMaterial & LineDashedMaterial ```javascript// Solid linesconst lineMaterial = new THREE.LineBasicMaterial({ color: 0xffffff, linewidth: 1, // Note: >1 only works on some systems linecap: "round", linejoin: "round",}); // Dashed linesconst dashedMaterial = new THREE.LineDashedMaterial({ color: 0xffffff, dashSize: 0.5, gapSize: 0.25, scale: 1,}); // Required for dashed linesconst line = new THREE.Line(geometry, dashedMaterial);line.computeLineDistances();``` ## ShaderMaterial Custom GLSL shaders with Three.js uniforms. ```javascriptconst material = new THREE.ShaderMaterial({ uniforms: { time: { value: 0 }, color: { value: new THREE.Color(0xff0000) }, texture1: { value: texture }, }, vertexShader: ` varying vec2 vUv; uniform float time; void main() { vUv = uv; vec3 pos = position; pos.z += sin(pos.x * 10.0 + time) * 0.1; gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0); } `, fragmentShader: ` varying vec2 vUv; uniform vec3 color; uniform sampler2D texture1; void main() { // Use texture2D() for GLSL 1.0, texture() for GLSL 3.0 (glslVersion: THREE.GLSL3) vec4 texColor = texture2D(texture1, vUv); gl_FragColor = vec4(color * texColor.rgb, 1.0); } `, transparent: true, side: THREE.DoubleSide,}); // Update uniform in animation loopmaterial.uniforms.time.value = clock.getElapsedTime();``` ### Built-in Uniforms (auto-provided) ```glsl// Vertex shaderuniform mat4 modelMatrix; // Object to worlduniform mat4 modelViewMatrix; // Object to camerauniform mat4 projectionMatrix; // Camera projectionuniform mat4 viewMatrix; // World to camerauniform mat3 normalMatrix; // For transforming normalsuniform vec3 cameraPosition; // Camera world position // Attributesattribute vec3 position;attribute vec3 normal;attribute vec2 uv;``` ## RawShaderMaterial Full control - no built-in uniforms/attributes. ```javascriptconst material = new THREE.RawShaderMaterial({ uniforms: { projectionMatrix: { value: camera.projectionMatrix }, modelViewMatrix: { value: new THREE.Matrix4() }, }, vertexShader: ` precision highp float; attribute vec3 position; uniform mat4 projectionMatrix; uniform mat4 modelViewMatrix; void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); } `, fragmentShader: ` precision highp float; void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); } `,});``` ## Common Material Properties All materials share these base properties: ```javascript// Visibilitymaterial.visible = true;material.transparent = false;material.opacity = 1.0;material.alphaTest = 0; // Discard pixels with alpha < value // Renderingmaterial.side = THREE.FrontSide; // FrontSide, BackSide, DoubleSidematerial.depthTest = true;material.depthWrite = true;material.colorWrite = true; // Blendingmaterial.blending = THREE.NormalBlending;// NormalBlending, AdditiveBlending, SubtractiveBlending, MultiplyBlending, CustomBlending // Stencilmaterial.stencilWrite = false;material.stencilFunc = THREE.AlwaysStencilFunc;material.stencilRef = 0;material.stencilMask = 0xff; // Polygon offset (z-fighting fix)material.polygonOffset = false;material.polygonOffsetFactor = 0;material.polygonOffsetUnits = 0; // Miscmaterial.dithering = false;material.toneMapped = true;``` ## Multiple Materials ```javascript// Assign different materials to geometry groupsconst geometry = new THREE.BoxGeometry(1, 1, 1);const materials = [ new THREE.MeshBasicMaterial({ color: 0xff0000 }), // right new THREE.MeshBasicMaterial({ color: 0x00ff00 }), // left new THREE.MeshBasicMaterial({ color: 0x0000ff }), // top new THREE.MeshBasicMaterial({ color: 0xffff00 }), // bottom new THREE.MeshBasicMaterial({ color: 0xff00ff }), // front new THREE.MeshBasicMaterial({ color: 0x00ffff }), // back];const mesh = new THREE.Mesh(geometry, materials); // Custom groupsgeometry.clearGroups();geometry.addGroup(0, 6, 0); // start, count, materialIndexgeometry.addGroup(6, 6, 1);``` ## Environment Maps ```javascript// Load cube textureconst cubeLoader = new THREE.CubeTextureLoader();const envMap = cubeLoader.load([ "px.jpg", "nx.jpg", // positive/negative X "py.jpg", "ny.jpg", // positive/negative Y "pz.jpg", "nz.jpg", // positive/negative Z]); // Apply to materialmaterial.envMap = envMap;material.envMapIntensity = 1; // Or set as scene environment (affects all PBR materials)scene.environment = envMap; // HDR environment (recommended)import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js";const rgbeLoader = new RGBELoader();rgbeLoader.load("environment.hdr", (texture) => { texture.mapping = THREE.EquirectangularReflectionMapping; scene.environment = texture; scene.background = texture;});``` ## Material Cloning and Modification ```javascript// Clone materialconst clone = material.clone();clone.color.set(0x00ff00); // Modify at runtimematerial.color.set(0xff0000);material.needsUpdate = true; // Only needed for some changes // When needsUpdate is required:// - Changing flat shading// - Changing texture// - Changing transparent// - Custom shader code changes``` ## Performance Tips 1. **Reuse materials**: Same material = batched draw calls2. **Avoid transparent when possible**: Transparent materials require sorting3. **Use alphaTest instead of transparency**: When applicable, faster4. **Choose simpler materials**: Basic > Lambert > Phong > Standard > Physical5. **Limit active lights**: Each light adds shader complexity ```javascript// Material poolingconst materialCache = new Map();function getMaterial(color) { const key = color.toString(16); if (!materialCache.has(key)) { materialCache.set(key, new THREE.MeshStandardMaterial({ color })); } return materialCache.get(key);} // Dispose when donematerial.dispose();``` ## See Also - `threejs-textures` - Texture loading and configuration- `threejs-shaders` - Custom shader development- `threejs-lighting` - Light interaction with materialsRelated skills
Threejs Animation
Handles the full Three.js animation pipeline from basic procedural motion to complex skeletal rigs with blend trees. Covers AnimationMixer setup, keyframe track
Threejs Fundamentals
Install Threejs Fundamentals skill for Claude Code from cloudai-x/threejs-skills.
Threejs Geometry
Install Threejs Geometry skill for Claude Code from cloudai-x/threejs-skills.