AgentSkillsCN

ta-r3f-materials

R3F 材质、着色器与视觉效果的选材与应用。无论是处理材质、PBR 纹理,还是编写着色器材质,此技能都能助您游刃有余。

SKILL.md
--- frontmatter
name: ta-r3f-materials
description: Material selection, shaders, and visual effects for R3F. Use when working with materials, PBR textures, shader materials.
category: visual

R3F Materials Skill

"Materials define the soul of your 3D objects – choose wisely."

When to Use This Skill

Use when:

  • Choosing material type for objects
  • Creating custom shaders
  • Implementing visual effects
  • Optimizing material performance

Quick Start

tsx
// Standard PBR material (recommended default)
<meshStandardMaterial
  color="royalblue"
  roughness={0.5}
  metalness={0.5}
/>

// Basic material (unlit, best performance)
<meshBasicMaterial color="red" />

// Physical material (advanced PBR)
<meshPhysicalMaterial
  clearcoat={1}
  clearcoatRoughness={0.1}
  transmission={0.9}
  thickness={0.5}
/>

Decision Framework

NeedMaterialPerformance
Unlit colormeshBasicMaterial⚡ Fastest
Simple shadingmeshLambertMaterial⚡⚡ Fast
Stylized lookmeshToonMaterial⚡⚡ Fast
Realistic PBRmeshStandardMaterial⚡⚡⚡ Medium
Glass/watermeshPhysicalMaterial⚡⚡⚡⚡ Slow
Custom effectsshaderMaterialVaries
Matcap lightingmeshMatcapMaterial⚡⚡ Fast

Progressive Guide

Level 1: Standard Materials

tsx
// Most common choice - good balance of quality and performance
<meshStandardMaterial
  color="#ff6600"
  roughness={0.7} // 0 = smooth, 1 = rough
  metalness={0.3} // 0 = dielectric, 1 = metal
  envMapIntensity={1}
/>

Level 2: Textured Materials

tsx
import { useTexture } from '@react-three/drei';

function TexturedMesh() {
  const [colorMap, normalMap, roughnessMap] = useTexture([
    '/textures/color.jpg',
    '/textures/normal.jpg',
    '/textures/roughness.jpg',
  ]);

  return (
    <mesh>
      <boxGeometry />
      <meshStandardMaterial map={colorMap} normalMap={normalMap} roughnessMap={roughnessMap} />
    </mesh>
  );
}

Level 3: Matcap Materials (Fast & Stylized)

tsx
import { useMatcapTexture } from '@react-three/drei';

function MatcapMesh() {
  const [matcap] = useMatcapTexture('3B3C3F_DAD9D5_929290_ABACA8');

  return (
    <mesh>
      <sphereGeometry />
      <meshMatcapMaterial matcap={matcap} />
    </mesh>
  );
}

Level 4: Custom Shaders

tsx
import { shaderMaterial } from '@react-three/drei';
import { extend, useFrame } from '@react-three/fiber';

const WaveShaderMaterial = shaderMaterial(
  { uTime: 0, uColor: new THREE.Color('hotpink') },
  // Vertex shader
  `
    uniform float uTime;
    varying vec2 vUv;

    void main() {
      vUv = uv;
      vec3 pos = position;
      pos.z += sin(pos.x * 4.0 + uTime) * 0.1;
      gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
    }
  `,
  // Fragment shader
  `
    uniform vec3 uColor;
    varying vec2 vUv;

    void main() {
      gl_FragColor = vec4(uColor, 1.0);
    }
  `
);

extend({ WaveShaderMaterial });

function WavyPlane() {
  const materialRef = useRef();

  useFrame((state) => {
    if (materialRef.current) {
      materialRef.current.uTime = state.clock.elapsedTime;
    }
  });

  return (
    <mesh>
      <planeGeometry args={[4, 4, 32, 32]} />
      <waveShaderMaterial ref={materialRef} />
    </mesh>
  );
}

Level 5: Transparent & Glass

tsx
// Glass/water with transmission
<meshPhysicalMaterial
  transmission={0.95}      // 0-1, how much light passes through
  thickness={0.5}          // Simulated thickness
  roughness={0.05}
  ior={1.5}               // Index of refraction
  clearcoat={1}
  clearcoatRoughness={0.1}
/>

// Simple transparency
<meshStandardMaterial
  transparent
  opacity={0.5}
  side={THREE.DoubleSide}
/>

Material Comparison

PropertyBasicLambertStandardPhysical
LightingNoDiffusePBRAdvanced PBR
RoughnessNoNoYesYes
MetalnessNoNoYesYes
ClearcoatNoNoNoYes
TransmissionNoNoNoYes
GPU CostLowLowMediumHigh

Anti-Patterns

DON'T:

  • Use meshPhysicalMaterial everywhere (performance killer)
  • Create new materials every render
  • Forget side={THREE.DoubleSide} for visible interiors
  • Use transmission without proper scene setup
  • Skip texture optimization (uncompressed textures)

DO:

  • Use simplest material that achieves the look
  • Reuse materials across similar objects
  • Use meshBasicMaterial for distant/small objects
  • Compress textures (WebP, basis universal)
  • Use material instances with drei

Performance Tips

tsx
// Share materials across instances
const sharedMaterial = useMemo(
  () => new THREE.MeshStandardMaterial({ color: 'red' }),
  []
);

// Use for many objects
<mesh material={sharedMaterial}>...</mesh>
<mesh material={sharedMaterial}>...</mesh>

Checklist

Before finalizing materials:

  • Appropriate material type for use case
  • Textures are optimized (compressed, power-of-2)
  • Materials shared where possible
  • Transparent materials have transparent: true
  • Double-sided materials explicitly set
  • Shader uniforms use refs for animation

Related Skills

For R3F fundamentals: Skill("ta-r3f-fundamentals") For performance optimization: Skill("ta-r3f-performance")

External References