mcpField
T
threejs-core-renderer

threejs-core-renderer

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

threejs-core-renderer について

threejs-core-renderer は、Three.js 開発者向けのレンダリングリファレンススキルです。WebGLRenderer、カメラ、レンダリングループ、リソースの解放に加え、カラー管理、シャドウ、レンダーターゲット、シェーダーコンパイルの設定を扱います。

主な機能

  1. 01WebGLRenderer とカラー管理の設定
  2. 02シャドウ、ビューポート、クリッピング平面の設定
  3. 03カメラ、サイズ変更、レンダリングループの管理
  4. 04レンダーターゲットの利用とシェーダーのコンパイル
  5. 05レンダラーリソースの解放

活用シーン

  1. 01Three.js の WebGL シーンの初期化
  2. 02ウィンドウに合わせたカメラとレンダラーのサイズ調整
  3. 03シャドウ、トーンマッピング、色空間の設定
  4. 04シーン削除時の WebGL リソース解放

インストール

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

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

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

同梱ファイル

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

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

詳細

threejs-core-renderer

クイックリファレンス

標準的な初期化パターン
import {
  WebGLRenderer, SRGBColorSpace, ACESFilmicToneMapping,
  PCFSoftShadowMap, PerspectiveCamera, Scene
} from 'three';

const renderer = new WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
renderer.outputColorSpace = SRGBColorSpace;
renderer.toneMapping = ACESFilmicToneMapping;
renderer.toneMappingExposure = 1.0;
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = PCFSoftShadowMap;
document.body.appendChild(renderer.domElement);

const scene = new Scene();
const camera = new PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000);

renderer.setAnimationLoop((time) => {
  renderer.render(scene, camera);
});
コンストラクターのパラメーター
パラメーター型デフォルト説明
canvasHTMLCanvasElementnew canvas既存のキャンバス要素
contextWebGLRenderingContextnew context既存の WebGL コンテキスト
precision'highp' | 'mediump' | 'lowp''highp'シェーダーの精度
alphabooleanfalseキャンバス背景を透明にするかどうか
premultipliedAlphabooleantrueプリマルチプライドアルファブレンディング
antialiasbooleanfalseMSAA アンチエイリアシング
stencilbooleantrueステンシルバッファー
preserveDrawingBufferbooleanfalseスクリーンショットに必要
powerPreference'high-performance' | 'low-power' | 'default''default'GPU 選択のヒント
failIfMajorPerformanceCaveatbooleanfalseソフトウェアレンダラーの場合に失敗させる
depthbooleantrue深度バッファー
logarithmicDepthBufferbooleanfalse大規模なシーンの Z ファイティングを修正

絶対に コンストラクターの実行後に antialias を変更しないでください。作成後は変更できません。

主なプロパティ
プロパティ型デフォルト説明
domElementHTMLCanvasElement--キャンバスです。必ず DOM に追加してください
shadowMap.enabledbooleanfalse影を使う場合は必ず true に設定してください
shadowMap.typeShadowMapTypePCFShadowMapシャドウフィルタリングのアルゴリズム
toneMappingToneMappingNoToneMappingHDR トーンマッピングのアルゴリズム
toneMappingExposurenumber1トーンマッピングの露出
outputColorSpacestringSRGBColorSpace出力の色空間
autoClearbooleantrue各レンダー呼び出しの前にクリアするかどうか
sortObjectsbooleantrue描画順を自動的に並べ替えるかどうか
clippingPlanesPlane[][]グローバルクリッピングプレーン
localClippingEnabledbooleanfalseマテリアルごとのクリッピングを有効にするかどうか
infoobject--レンダリング統計(呼び出し回数、三角形数、メモリ)
重要な警告

ピクセル比の上限設定を絶対に忘れないでください。3x 以上の画面で devicePixelRatio に上限を設けないと、ピクセル負荷が 9 倍以上になります。必ず Math.min(window.devicePixelRatio, 2) を使用してください。

最初のレンダリング後に shadowMap.type を絶対に変更しないでください。シェーダー全体の再コンパイルが発生します。必ず初期化時に一度だけ設定してください。

本番環境のレンダリングループで preserveDrawingBuffer: true を絶対に使用しないでください。バッファースワップの最適化が無効になります。スクリーンショットが必要な場合にのみ有効にしてください。

カメラの near: 0 は絶対に設定しないでください。あらゆる場所で Z ファイティングが発生します。必ず far / near の比率を 10,000 未満に保ってください。

fov、aspect、near、far、または zoom を変更した後に、camera.updateProjectionMatrix() を呼び出すのを絶対に忘れないでください。投影行列は自動更新されません。

Three.js r160 以降で、生の requestAnimationFrame を絶対に使用しないでください。WebXR セッションを自動的に処理する renderer.setAnimationLoop() を必ず使用してください。

クリーンアップ時に renderer.dispose() を呼び出すのを絶対に忘れないでください。呼び出さないと、WebGL コンテキスト、プログラム、テクスチャ、フレームバッファーがリークします。


色管理

Three.js r160 以降では、出力時に自動で sRGB 変換を行うリニアワークフローを使用します。

色空間のルール
テクスチャの種類colorSpace例
カラー/アルベドSRGBColorSpaceディフューズマップ、エミッシブマップ
データLinearSRGBColorSpace法線マップ、ラフネス、メタルネス、AO、ディスプレイスメント

ルール: カラーテクスチャは必ず SRGBColorSpace に設定してください。データテクスチャは必ず LinearSRGBColorSpace に設定してください。これらを取り違えると、白っぽくなったり、彩度が高くなりすぎたりするレンダリング結果になります。

トーンマッピングの選択フローチャート
定数使用する場面
NoToneMapping非写実的レンダリング、UI オーバーレイ、アンリットシーン
LinearToneMapping色変換を最小限に抑えた、基本的な HDR のクランプ
ReinhardToneMapping汎用用途。色相を良好に保ちます
CineonToneMapping映画フィルムのようなルック
ACESFilmicToneMappingPBR のデフォルトの選択肢です。 業界標準のフィルム調カーブ
AgXToneMapping彩度の高い色では ACES より優れています。明るい青や赤での ACES の色相シフトを回避します。(r160 以降)
NeutralToneMapping色の正確さを最優先する場合。芸術的な変換を最小限に抑えます

PBR ワークフローでは、必ず ACESFilmicToneMapping または AgXToneMapping を使用してください。彩度の高い色を正確に保つ必要がある場合は、AgXToneMapping を推奨します。


シャドウマップの設定

import { PCFSoftShadowMap } from 'three';

renderer.shadowMap.enabled = true;
renderer.shadowMap.type = PCFSoftShadowMap;
種類品質パフォーマンス備考
BasicShadowMap低(エッジが硬い)最速フィルタリングなし
PCFShadowMap中中デフォルト。パーセンテージ・クローサー・フィルタリング
PCFSoftShadowMap高(エッジが柔らかい)低速バイリニア PCF。最も一般的な選択肢
VSMShadowMap高(非常に柔らかい)最も低速ライトブリーディングのアーティファクトが発生することがあります

レンダーループとリサイズ

setAnimationLoop(推奨)
renderer.setAnimationLoop((time) => {
  // time is DOMHighResTimeStamp in milliseconds
  renderer.render(scene, camera);
});

// Stop the loop
renderer.setAnimationLoop(null);
ウィンドウのリサイズハンドラー
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
});

setSize() の前に、必ず camera.aspect を更新し、updateProjectionMatrix() を呼び出してください。


カメラシステム

PerspectiveCamera
import { PerspectiveCamera } from 'three';

const camera = new PerspectiveCamera(
  50,                                        // fov (vertical, degrees)
  window.innerWidth / window.innerHeight,    // aspect ratio
  0.1,                                       // near
  1000                                       // far
);
camera.position.set(0, 5, 10);
camera.lookAt(0, 0, 0);

fov、aspect、near、far、または zoom を変更した後は、必ず camera.updateProjectionMatrix() を呼び出してください。

OrthographicCamera
import { OrthographicCamera } from 'three';

const frustumSize = 10;
const aspect = window.innerWidth / window.innerHeight;
const camera = new OrthographicCamera(
  -frustumSize * aspect / 2,   // left
   frustumSize * aspect / 2,   // right
   frustumSize / 2,            // top
  -frustumSize / 2,            // bottom
  0.1, 1000
);

リサイズ時は、必ず視錐台の 6 つのパラメーター(left、right、top、bottom、near、far)をすべて更新し、その後 updateProjectionMatrix() を呼び出してください。

ArrayCamera

1 回の render() 呼び出しで複数のビューポートをレンダリングします。各サブカメラには camera.viewport = new Vector4(x, y, width, height) を設定します。分割画面や VR ステレオに使用します。

CubeCamera

シーンを 6 方向から WebGLCubeRenderTarget にレンダリングします。動的な環境マップに使用します。静的な環境では、cubeCamera.update() を毎フレーム呼び出してはいけません。呼び出すたびにシーンを 6 回レンダリングします。


レンダーターゲット

import { WebGLRenderTarget } from 'three';

const renderTarget = new WebGLRenderTarget(1024, 1024);
renderer.setRenderTarget(renderTarget);
renderer.render(scene, camera);
renderer.setRenderTarget(null); // restore default framebuffer
// renderTarget.texture is now usable as a regular Texture

不要になったレンダーターゲットでは、必ず renderTarget.dispose() を呼び出してください。


シェーダーのコンパイル

// Synchronous -- blocks the thread
renderer.compile(scene, camera);

// Asynchronous -- non-blocking, prevents frame drops (r160+)
await renderer.compileAsync(scene, camera);

ジャストインタイムのシェーダーコンパイルによるカクつきを防ぐため、アセットの読み込み後、最初の表示レンダリングの前に必ず compileAsync() を呼び出してください。


ビューポートとシザー

// Render to a sub-region of the canvas
renderer.setViewport(x, y, width, height);
renderer.setScissor(x, y, width, height);
renderer.setScissorTest(true);
renderer.render(scene, camera);

// Reset to full canvas
renderer.setScissorTest(false);
renderer.setViewport(0, 0, canvas.width, canvas.height);

クリッピング平面

import { Plane, Vector3 } from 'three';

// Global clipping (affects all objects)
renderer.clippingPlanes = [new Plane(new Vector3(0, -1, 0), 1)];

// Per-material clipping (MUST enable localClippingEnabled)
renderer.localClippingEnabled = true;
material.clippingPlanes = [plane];
material.clipIntersection = false; // false = union, true = intersection
material.clipShadows = true;       // also clip shadow geometry

クリーンアップと破棄

renderer.setAnimationLoop(null);
renderer.dispose();
renderer.domElement.remove();

レンダラーを削除するときは、必ず dispose() を呼び出してください。これにより、WebGL コンテキスト、コンパイル済みのシェーダープログラム、テクスチャ、フレームバッファーがすべて解放されます。


WebGPU レンダラー

Three.js には、TSL(Three Shading Language)のノードベースマテリアルを使用する実験的な WebGPURenderer が含まれています。WebGPU 固有のガイダンスについては、threejs-impl-webgpu スキルを参照してください。


参考リンク

公式情報源

コメント