mcpField
T
threejs-syntax-materials

threejs-syntax-materials

github.com/impertio-studio開発23137 回インストール30 週間前に更新
リポジトリ

threejs-syntax-materials について

Three.js 開発者向けに、マテリアルとテクスチャの選択・設定をまとめたリファレンススキルです。色空間の規則、ライフサイクルのメソッド、描画時の注意点も扱います。

主な機能

  1. 01用途に応じたマテリアル選択
  2. 02基本プロパティとメソッド
  3. 03PBR と高度なマテリアルの解説
  4. 04テクスチャの色空間とラッピング規則
  5. 05シェーダー更新と GPU 解放の注意

活用シーン

  1. 01シーン内オブジェクトのマテリアル選定
  2. 02テクスチャの色空間の適切な設定
  3. 03オブジェクト削除時の GPU リーク防止

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/impertio-studio/three.js-claude-skill-package --skill threejs-syntax-materials

インストール後、Claude Code で/threejs-syntax-materialsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.gitkeep
references/
anti-patterns.md
examples.md
methods.md

詳細

threejs-syntax-materials

クイックリファレンス

マテリアルタイプの選択ツリー
用途マテリアル理由
UI 要素、ライティングなしのシーンMeshBasicMaterial最も低負荷で、光の計算が不要です
マットな拡散反射(ローエンドデバイス向け)MeshLambertMaterial高速な拡散反射で、鏡面反射はありません
レガシーな鏡面ハイライトMeshPhongMaterialBlinn-Phong モデルで、物理的に正確ではありません
汎用 3D(推奨)MeshStandardMaterialPBR のメタリックネス/粗さで、業界標準です
ガラス、車の塗装、布、シャボン玉MeshPhysicalMaterial高度な PBR(クリアコート、透過、シーン、虹彩効果)
カートゥーン/アニメ調MeshToonMaterial段階的なセルシェーディング
スカルプトのプレビュー、ライトなしMeshMatcapMaterialMatcap テクスチャを使用し、ライトの設定は不要です
法線のデバッグMeshNormalMaterialRGB で表面法線の方向を表します
透明なシャドウレシーバーShadowMaterial透明なシャドウキャッチャーです
実線LineBasicMaterialシンプルな色付きの線です
破線LineDashedMaterialline.computeLineDistances() が必要です
パーティクルPointsMaterial点群のレンダリングです
ビルボードSpriteMaterial常にカメラの方向を向く四角形です
基本マテリアルプロパティ(全マテリアル共通)
プロパティ型デフォルト説明
sidenumberFrontSideFrontSide、BackSide、または DoubleSide
transparentbooleanfalseアルファブレンディングを有効にします
opacitynumber11 未満の値を有効にするには、transparent: true が必要です
depthWritebooleantrue深度バッファに書き込みます
depthTestbooleantrue深度バッファに対してテストします
blendingnumberNormalBlendingNoBlending、AdditiveBlending、SubtractiveBlending、MultiplyBlending、CustomBlending
alphaTestnumber0アルファ値がこの値を下回るフラグメントを破棄します
visiblebooleantrueこのマテリアルをレンダリングするかどうか
wireframebooleanfalseワイヤーフレームのレンダリングモード
fogbooleantrueシーンのフォグの影響を受けます
clippingPlanesPlane[]nullクリッピングプレーンの配列
clipIntersectionbooleanfalseすべてのプレーンが交差する部分でクリップします(和集合ではありません)
needsUpdatebooleanfalseシェーダーを再コンパイルするには true に設定します
toneMappedbooleantrueレンダラーのトーンマッピングを適用します
基本マテリアルメソッド
メソッドシグネチャ説明
clone(): Materialマテリアルを複製します
copy(source: Material): Materialsource からプロパティをコピーします
dispose(): voidGPU リソースを解放します。削除するときは必ず呼び出してください
onBeforeCompile(shader, renderer): voidコンパイル前にシェーダーを変更するためのフックです
setValues(values: Object): void複数のプロパティを一度に設定します
重要な警告

transparent: true を指定せずに opacity < 1 を設定しては絶対にいけません。opacity の値は無視されます。必ず両方をセットで指定してください。

MeshStandardMaterial で十分な場合に MeshPhysicalMaterial を使っては絶対にいけません。Physical は大幅に大きなシェーダーをコンパイルします。クリアコート、透過、シーン、イリデッセンス、または異方性が必要な場合にのみ使用してください。

法線マップ、粗さマップ、メタルネスマップ、またはデータテクスチャに SRGBColorSpace を設定しては絶対にいけません。データが破損し、ライティングが不正になります。SRGBColorSpace はディフューズ/カラー/エミッシブテクスチャにのみ設定してください。

オブジェクトを削除する際に material.dispose() と texture.dispose() の呼び出しを忘れては絶対にいけません。GPU メモリリークが蓄積し、アプリケーションがクラッシュします。

LineBasicMaterial で linewidth > 1 を設定しては絶対にいけません。WebGL の制限により、ほとんどのプラットフォームでは無視されます。太い線には必ず three/addons/lines/ の Line2 と LineMaterial を使用してください。

シェーダーのコンパイルに影響するプロパティを変更した後は、必ず material.needsUpdate = true を設定してください(例:flatShading の切り替え、side の変更、実行時のテクスチャマップの追加/削除)。

texture.repeat に (1, 1) 以外の値を使用する場合は、必ず wrapS と wrapT を RepeatWrapping に設定してください。デフォルトの ClampToEdgeWrapping ではテクスチャはタイル状に繰り返されません。


MeshStandardMaterial(PBR)

ほとんどの 3D シーンに推奨されるマテリアルです。物理ベースのメタルネス/粗さワークフローを使用します。

import { MeshStandardMaterial, TextureLoader, SRGBColorSpace, RepeatWrapping } from 'three';

const loader = new TextureLoader();
const material = new MeshStandardMaterial({
  color: 0xffffff,
  roughness: 0.7,           // 0 = mirror, 1 = fully rough
  metalness: 0.0,           // 0 = dielectric, 1 = metal
  map: null,                // Diffuse/albedo texture
  roughnessMap: null,       // Per-pixel roughness
  metalnessMap: null,       // Per-pixel metalness
  normalMap: null,          // Surface normal perturbation
  normalScale: new Vector2(1, 1),
  aoMap: null,              // Ambient occlusion (requires uv2)
  aoMapIntensity: 1.0,
  emissive: 0x000000,       // Emissive color
  emissiveMap: null,        // Emissive texture
  emissiveIntensity: 1.0,
  envMap: null,             // Environment reflection map
  envMapIntensity: 1.0,
  bumpMap: null,            // Grayscale height map
  bumpScale: 1.0,
  displacementMap: null,    // Vertex displacement map
  displacementScale: 1.0,
  displacementBias: 0.0,
  alphaMap: null,           // Per-pixel transparency
  lightMap: null,           // Baked lighting (requires uv2)
  lightMapIntensity: 1.0,
  flatShading: false,
  wireframe: false,
  fog: true
});

MeshPhysicalMaterial(高度な PBR)

MeshStandardMaterial のすべてのプロパティに加え、以下を拡張します。

プロパティ型デフォルト説明
clearcoatfloat0.0クリアコート層の強度(0~1)
clearcoatRoughnessfloat0.0クリアコートの粗さ
clearcoatMapTexturenullクリアコート強度マップ
clearcoatNormalMapTexturenullクリアコート法線マップ
transmissionfloat0.0物理ベースの透過(0~1)
transmissionMapTexturenull透過マップ
thicknessfloat0.0透過におけるボリュームの厚さ
thicknessMapTexturenull厚さマップ
iorfloat1.5屈折率(1.0~2.333)
attenuationDistancefloatInfinityボリューム内での光の減衰距離
attenuationColorColorwhite光の減衰色
sheenfloat0.0シーン層の強度(布のような質感)
sheenColorColor0x000000シーンの色合い
sheenRoughnessfloat1.0シーンの粗さ
iridescencefloat0.0薄膜干渉(0~1)
iridescenceIORfloat1.3イリデッセンスの屈折率
iridescenceThicknessRange[float, float][100, 400]薄膜の厚さの範囲(nm)
anisotropyfloat0.0異方性反射の強度
anisotropyRotationfloat0.0異方性の回転(ラジアン)
specularIntensityfloat1.0鏡面反射層の強度
specularColorColorwhite鏡面反射の色合い
dispersionfloat0.0色分散(虹色効果)
reflectivityfloat0.5法線入射時の反射率

テクスチャシステム

カラースペースのルール(重要)
マップの種類カラースペース使用チャンネル
map(ディフューズ/アルベド)SRGBColorSpaceRGB(A)
emissiveMapSRGBColorSpaceRGB
lightMapSRGBColorSpaceRGB
envMapSRGBColorSpaceRGB
sheenColorMapSRGBColorSpaceRGB
specularColorMapSRGBColorSpaceRGB
normalMapNoColorSpaceRGB
roughnessMapNoColorSpaceG チャンネル
metalnessMapNoColorSpaceB チャンネル
aoMapNoColorSpaceR チャンネル
bumpMapNoColorSpaceR チャンネル
displacementMapNoColorSpaceR チャンネル
alphaMapNoColorSpaceR チャンネル
clearcoatMapNoColorSpaceR チャンネル
clearcoatRoughnessMapNoColorSpaceR チャンネル
clearcoatNormalMapNoColorSpaceRGB
transmissionMapNoColorSpaceR チャンネル
thicknessMapNoColorSpaceR チャンネル
iridescenceMapNoColorSpaceR チャンネル
iridescenceThicknessMapNoColorSpaceR チャンネル
sheenRoughnessMapNoColorSpaceR チャンネル
anisotropyMapNoColorSpaceRG チャンネル
specularIntensityMapNoColorSpaceA チャンネル

ルール:ディフューズ/エミッシブ/カラーのテクスチャには SRGBColorSpace を使用します。すべてのデータテクスチャには NoColorSpace を使用します。設定を誤ると、レンダリングが白っぽくなったり、彩度が過剰になったりします。

テクスチャローダー
ローダー形式インポート
TextureLoaderPNG、JPG、WebPthree コア
CubeTextureLoader6 面の PNG/JPG キューブマップthree コア
RGBELoader.hdr(Radiance HDR)three/addons/loaders/RGBELoader.js
EXRLoader.exr(OpenEXR HDR)three/addons/loaders/EXRLoader.js
KTX2Loader.ktx2(GPU 圧縮)three/addons/loaders/KTX2Loader.js
ラップモード
定数説明
ClampToEdgeWrapping端のテクセルを引き伸ばします(デフォルト)
RepeatWrappingテクスチャをタイル状に繰り返します
MirroredRepeatWrappingミラー反転を交互に行いながらタイル状に繰り返します
フィルターモード
定数種類説明
NearestFilter拡大/縮小ピクセル感のある鮮明な表示(レトロ調、トゥーン調のグラデーション)
LinearFilter拡大/縮小滑らかな補間
LinearMipmapLinearFilter縮小トライリニアフィルタリング(デフォルト、最高品質)
テクスチャのプロパティ
プロパティ型デフォルト説明
wrapS / wrapTnumberClampToEdgeWrappingラップモード
magFilternumberLinearFilter拡大フィルター
minFilternumberLinearMipmapLinearFilter縮小フィルター
anisotropynumber1異方性フィルタリング(最大値 = renderer.capabilities.getMaxAnisotropy())
repeatVector2(1, 1)UV の繰り返し回数
offsetVector2(0, 0)UV オフセット
rotationnumber0UV の回転角度(ラジアン)
centerVector2(0, 0)回転の中心
flipYbooleantrueアップロード時に垂直方向に反転
colorSpacestringNoColorSpaceカラースペースの解釈
generateMipmapsbooleantrueミップマップを自動生成
needsUpdatebooleanfalseGPU への再アップロードを実行
flipY のルール
  • flipY = true(デフォルト):読み込んだ画像テクスチャ(PNG、JPG)に適しています
  • flipY = false:WebGLRenderTarget のテクスチャ、DataTexture、フレームバッファーテクスチャには必ず使用します

マテリアルの破棄

// ALWAYS dispose materials and textures when removing objects
function disposeMesh(mesh) {
  if (mesh.material) {
    // Dispose all texture maps
    for (const key of Object.keys(mesh.material)) {
      const value = mesh.material[key];
      if (value && value.isTexture) {
        value.dispose();
      }
    }
    mesh.material.dispose();
  }
  if (mesh.geometry) {
    mesh.geometry.dispose();
  }
}

needsUpdate フラグ

実行時に以下を変更した後は、必ず material.needsUpdate = true を設定してください:

  • flatShading の切り替え
  • side の変更(FrontSide/BackSide/DoubleSide)
  • テクスチャマップの追加または削除(例:map を null からテクスチャに変更)
  • transparent または alphaTest の変更
  • wireframe の切り替え
  • コンパイルされるシェーダーバリアントを変更するプロパティ

毎フレーム needsUpdate = true を設定してはいけません。シェーダーの再コンパイルに大きなコストがかかります。プロパティを変更した後に一度だけ設定してください。

テクスチャの場合:texture.image のデータを変更した後、GPU への再アップロードを実行するために texture.needsUpdate = true を設定してください。


トゥーンマテリアルの特別ルール

MeshToonMaterial を使用する場合は、必ず gradientMap.minFilter = NearestFilter と gradientMap.magFilter = NearestFilter を設定してください。線形フィルタリングでは、段階的な陰影がぼやけて滑らかなグラデーションになり、トゥーン効果が損なわれます。


参考リンク

公式ソース

コメント