Threejs Materials Lighting

作者 gamedev-skillsd4b0e35550c5無授權條款1.3K 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫11 天前更新

Light and shade a three.js scene: choose materials (MeshStandardMaterial PBR vs unlit MeshBasicMaterial), add ambient/hemisphere/directional/point/spot lights, turn on shadow maps, and use an environment map (IBL) for realistic reflections. Use when a three.js model looks black, flat, or wrong — when the user mentions three.js materials, MeshStandardMaterial, lights, shadows, envMap, or PBR. For renderer/loop setup use threejs-scene-setup; for loading models use threejs-gltf-loading.

AI 產生的概覽

指導 three.js 的材質選擇、燈光配置、陰影設定與環境貼圖反射,解決模型變黑或平淡的問題。

功能
提供選擇 three.js 材質的說明與程式碼範例,例如 MeshStandardMaterial、MeshPhysicalMaterial,以及不受燈光影響的 MeshBasicMaterial,並說明如何加入環境光、半球光、平行光、點光源與聚光燈。內容涵蓋在渲染器、燈光與網格三處啟用陰影貼圖、調整陰影相機、以正確色彩空間套用 PBR 貼圖,以及透過 HDR 環境貼圖實現以影像為基礎的照明。同時列出常見問題,例如網格全黑、場景過暗、陰影缺失與顏色偏白。
適用情境
當 three.js 網格顯示為黑色、平淡或光照不正確時使用,也適用於使用者提到 three.js 材質、MeshStandardMaterial、燈光、陰影、envMap 或 PBR 的情況。不適用於渲染器、相機或動畫迴圈的建置、模型載入,以及自訂 GLSL 著色器。
執行需求
不含指令碼,僅為說明文件。需要 three.js 專案(範例針對 r186);以影像為基礎的照明範例另需透過 HDRLoader 載入的 HDR 環境檔案。隨附參考檔案 references/materials-lights-table.md,用於查閱材質速查表與燈光參數。

three.js Materials & Lighting

Make three.js surfaces look right: pick the correct material, light the scene, enable shadows, and add image-based lighting. Patterns target r186, verified against r186 (lighting is physically based by default since r155).

When to use

  • Use when a mesh renders black or flat, when choosing a material, adding lights, enabling shadows, or setting up environment-map reflections (IBL).
  • Use when code constructs MeshStandardMaterial, DirectionalLight, etc., or sets renderer.shadowMap.enabled or scene.environment.

When not to use: the renderer/camera/loop → threejs-scene-setup. Loading models (whose PBR materials this complements) → threejs-gltf-loading. Custom GLSL/ShaderMaterial is its own topic; for the portable concept see shader-programming.

Core workflow

  1. Pick a material by need. MeshStandardMaterial (PBR: roughness, metalness, reacts to lights/IBL) for realism; MeshPhysicalMaterial for clearcoat/transmission; MeshBasicMaterial (unlit, ignores lights) for UI/flat; MeshNormalMaterial/MeshDepthMaterial for debugging.
  2. Add light, or nothing shows. Lit materials need a light source and/or scene.environment. Combine a soft fill (AmbientLight/HemisphereLight) with a key DirectionalLight.
  3. Mind light intensity. Since r155, lighting is physically based; modern intensities are higher than old tutorials (a key DirectionalLight ≈ 1–3).
  4. Enable shadows in three places. renderer.shadowMap.enabled = true, the light's castShadow = true, and each mesh's castShadow/receiveShadow. Then fit the light's shadow camera to the scene.
  5. Use an environment map for grounded reflections. Assign an equirectangular or PMREM-processed texture to scene.environment; PBR materials pick it up automatically.
  6. Verify under real lighting — confirm the surface responds to the key light (highlights move), shadows land where expected, and reflections look plausible.

Patterns

1. PBR material under a 3-light rig

js
import * as THREE from 'three';
const material = new THREE.MeshStandardMaterial({  color: 0xcc4444,  roughness: 0.5,     // 0 = mirror, 1 = fully matte  metalness: 0.0,     // 0 = dielectric (plastic/wood), 1 = metal});const mesh = new THREE.Mesh(new THREE.SphereGeometry(1, 32, 16), material);scene.add(mesh);
// Soft sky/ground fill + a directional key light.scene.add(new THREE.HemisphereLight(0xbbddff, 0x443322, 1.0)); // sky, ground, intensityconst key = new THREE.DirectionalLight(0xffffff, 2.5);key.position.set(5, 10, 7);scene.add(key);

2. Unlit material (no light needed)

js
// MeshBasicMaterial ignores lights — for flat color, UI, or sprites/labels.const flat = new THREE.MeshBasicMaterial({ color: 0x44aa88 });// A textured color map should be tagged sRGB so colors aren't washed out:const tex = new THREE.TextureLoader().load('assets/logo.png');tex.colorSpace = THREE.SRGBColorSpace;const logo = new THREE.MeshBasicMaterial({ map: tex, transparent: true });

3. Shadows (the three required switches + camera fit)

js
renderer.shadowMap.enabled = true;renderer.shadowMap.type = THREE.PCFShadowMap;         // soft by default since r182
const sun = new THREE.DirectionalLight(0xffffff, 3);sun.position.set(8, 12, 6);sun.castShadow = true;sun.shadow.mapSize.set(2048, 2048);                   // default 512; raise for crisp// DirectionalLight uses an OrthographicCamera — fit it tightly to the scene:const cam = sun.shadow.camera;cam.near = 1; cam.far = 40;cam.left = -15; cam.right = 15; cam.top = 15; cam.bottom = -15;scene.add(sun);
mesh.castShadow = true;ground.receiveShadow = true;                          // a plane to catch the shadow

4. PBR textures on a material

js
const loader = new THREE.TextureLoader();const colorMap = loader.load('assets/brick_color.jpg');colorMap.colorSpace = THREE.SRGBColorSpace;           // color maps are sRGBconst normalMap = loader.load('assets/brick_normal.jpg'); // data maps stay linearconst roughMap  = loader.load('assets/brick_rough.jpg');
const brick = new THREE.MeshStandardMaterial({  map: colorMap,  normalMap,  roughnessMap: roughMap,  metalness: 0,});

5. Image-based lighting from an HDR environment

js
import { HDRLoader } from 'three/addons/loaders/HDRLoader.js'; // RGBELoader before r180
new HDRLoader().load('assets/studio.hdr', (hdr) => {  hdr.mapping = THREE.EquirectangularReflectionMapping;  scene.environment = hdr;     // lights + reflects all PBR materials  scene.background = hdr;       // optional: show it as the backdrop});// Optional cinematic tone curve:renderer.toneMapping = THREE.ACESFilmicToneMapping;renderer.toneMappingExposure = 1.0;

Pitfalls

  • Mesh is pure black → a lit material with no light and no scene.environment. Add a light or an environment map; to confirm geometry, temporarily swap to MeshBasicMaterial/MeshNormalMaterial.
  • Scene too dark even with lights → old tutorial intensities. r155+ is physically based; raise intensities (key light ≈ 2–3) or add an environment map.
  • Shadows don't appear → you missed one of the three switches (renderer.shadowMap.enabled, light.castShadow, mesh castShadow/ receiveShadow).
  • Shadows are cut off or blocky → the DirectionalLight's orthographic shadow.camera frustum is too big/small or doesn't cover the scene; tighten left/right/top/bottom/near/far and raise shadow.mapSize. Visualise it with new THREE.CameraHelper(light.shadow.camera).
  • Shadow acne / peter-panning → adjust light.shadow.bias (small negative) and light.shadow.normalBias.
  • Colors look washed out / too bright → color (albedo) textures need texture.colorSpace = THREE.SRGBColorSpace; normal/roughness/metalness maps must stay linear (leave them as NoColorSpace).
  • PointLight shadows tank performance → a point light renders the scene 6 times (cube map). Prefer one shadow-casting DirectionalLight; use cheaper fakes elsewhere.

References

  • For the material cheat-sheet (which Mesh*Material for which look), light types and their parameters/units, transparency vs alphaTest ordering, and the PMREMGenerator/RoomEnvironment route to IBL without an HDR file, read references/materials-lights-table.md.

Related skills

  • threejs-scene-setup — renderer, camera, and loop (set shadowMap, tone mapping).
  • threejs-gltf-loading — models arrive with PBR materials this skill tunes.
  • shader-programming — custom shader effects (engine-agnostic concept).

來源與署名

來源:gamedev-skills/awesome-gamedev-agent-skills位於skills/web-engines/threejs-materials-lighting提交d4b0e35

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架