pixijs-custom-rendering
PixiJS v8 でカスタムシェーダー・フィルター・バッチャーを実装する際に使用するスキルです。`Shader.from`・`GlProgram`/`GpuProgram`・`UniformGroup`(型付きuniform、UBOモード)・`Filter.from` によるカスタムフィルター・GLSL ES 3.0 の記法(`in`/`out`、`finalColor`、`texture()`)・`uBackTexture` サンプリング・CSP 対応の `pixi.js/unsafe-eval`・extensions を用いたカスタム Batcher など、描画パイプラインの拡張に必要な知識を網羅します。`Shader`・`UniformGroup`・`GLSL`/`WGSL`・`UBO`・`finalColor`・`uBackTexture`・`blendRequired` といったキーワードが登場する場面でトリガーされます。
description の原文を見る
Use this skill when writing custom shaders, uniforms, filters, or batchers in PixiJS v8. Covers Shader.from({gl, gpu, resources}), GlProgram/GpuProgram, UniformGroup with typed uniforms (f32, vec2, mat4x4), UBO mode, textures as resources, custom Filter via Filter.from, GLSL ES 3.0 conventions (in/out, finalColor, texture()), uBackTexture sampling, pixi.js/unsafe-eval for strict CSP, custom Batcher via extensions. Triggers on: Shader, GlProgram, GpuProgram, UniformGroup, Batcher, Filter, Filter.from, GLSL, WGSL, UBO, uniform, custom shader, finalColor, uBackTexture, blendRequired, unsafe-eval.
SKILL.md 本文
カスタムシェーダーは Shader.from({ gl, gpu, resources }) を使用してGLSLおよびWGSLプログラムをシーンオブジェクトにバインドします。ユニフォームは型付き UniformGroup に格納され、テクスチャは個別のリソースとして渡され、同じシェーダーでWebGLとWebGPUの両方をターゲットにできます。
クイックスタート
const uniforms = new UniformGroup({
uTime: { value: 0, type: "f32" },
});
const shader = Shader.from({
gl: { vertex: vertexSrc, fragment: fragmentSrc },
resources: { uniforms },
});
const geometry = new MeshGeometry({
positions: new Float32Array([0, 0, 100, 0, 100, 100, 0, 100]),
uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),
indices: new Uint32Array([0, 1, 2, 0, 2, 3]),
});
const mesh = new Mesh({ geometry, shader });
app.stage.addChild(mesh);
app.ticker.add(() => {
shader.resources.uniforms.uniforms.uTime = performance.now() / 1000;
});
関連スキル: pixijs-filters (組み込みフィルター)、pixijs-scene-mesh (カスタムジオメトリ)、pixijs-performance (バッチ最適化)、pixijs-migration-v8 (v7からのシェーダーAPI移行)。
コアパターン
デュアルレンダラーシェーダー (WebGL + WebGPU)
import { Shader, GlProgram, GpuProgram, UniformGroup } from "pixi.js";
const glVertex = `...`; // GLSLバーテックス (必要に応じて `#version 300 es` を自分で記述してください)
const glFragment = `...`; // GLSLフラグメント
const wgslSource = `...`; // WGSL統合
const shader = Shader.from({
gl: { vertex: glVertex, fragment: glFragment },
gpu: {
// entryPoint名は任意です。WGSLソース内の @vertex / @fragment
// 関数名と一致する必要があります。PixiJSは
// 'mainVert' / 'mainFrag' を使用した例を提供していますが、`main` も同様に有効です。
vertex: { entryPoint: "mainVert", source: wgslSource },
fragment: { entryPoint: "mainFrag", source: wgslSource },
},
resources: {
myUniforms: new UniformGroup({
uColor: { value: new Float32Array([1, 0, 0, 1]), type: "vec4<f32>" },
uMatrix: { value: new Float32Array(16), type: "mat4x4<f32>" },
}),
},
});
gl のみが指定されている場合、シェーダーはWebGLのみで動作します。gpu のみが指定されている場合、WebGPUのみで動作します。compatibleRenderers ビットマスクは自動的に設定されます。
GlProgram は 自動的に #version 300 es を注入しません。#version 300 es を自分で記述すると、PixiJSはそれを保持してシェーダーをGLSL ES 3.0として扱います。そうでない場合は、WebGL1互換マクロ (#define in varying、#define texture texture2D) を注入し、WebGL1スタイルのGLSLとして実行します。GlProgram は常にデフォルト精度 (バーテックス highp、フラグメント mediump) とプログラム名を注入します。GLSL ES 3.0の場合、attribute/varying の代わりに in/out を使用し、texture2D() の代わりに texture() を使用し、gl_FragColor の代わりに out vec4 を使用します。
リソースとしてのテクスチャ
テクスチャはリソースであり、ユニフォームではありません。テクスチャの source と style を個別に渡します:
import { Shader, UniformGroup, Texture, Assets } from "pixi.js";
const texture = await Assets.load("myImage.png");
const shader = Shader.from({
gl: { vertex: vertSrc, fragment: fragSrc },
resources: {
uTexture: texture.source,
uSampler: texture.source.style,
myUniforms: new UniformGroup({
uAlpha: { value: 1.0, type: "f32" },
}),
},
});
// 実行時にテクスチャをスワップ
shader.resources.uTexture = otherTexture.source;
リソースはフラットなキー値マップです。キーはシェーダーソース内のユニフォーム/バインディング名と一致する必要があります。
リソースは、プレーンオブジェクトにすることもできます (自動的に UniformGroup にラップされます):
const shader = Shader.from({
gl: { vertex: vertSrc, fragment: fragSrc },
resources: {
myUniforms: {
uTime: { value: 0, type: "f32" },
},
},
});
UBOモード (Uniform Buffer Objects)
UBOモードは、ユニフォームを単一のGPUバッファーに詰め込みます。WebGPUでは必須です。WebGLでは随意です (WebGL2+)。
import { UniformGroup } from "pixi.js";
const ubo = new UniformGroup(
{
uProjection: { value: new Float32Array(16), type: "mat4x4<f32>" },
uAlpha: { value: 1.0, type: "f32" },
},
{ ubo: true, isStatic: true },
);
// isStatic が true の場合、手動で update() を呼び出す必要があります
ubo.uniforms.uAlpha = 0.5;
ubo.update();
UBOのルール:
f32およびi32ベースの型のみがサポートされます (u32は不可)。行列はfloatのみです。- サンプラー/テクスチャはUBOに置くことはできません。
- リソース内のUniformGroup名は、シェーダー内のUBOブロック名と正確に一致する必要があります。
- 構造と順序は、シェーダーレイアウトと正確に一致する必要があります。
- UBO同期は、内部で
new Functionを使用します。厳密なCSP環境 (unsafe-evalなし) では、起動時にpixi.js/unsafe-evalをインポートしてフォールバック同期パスに切り替えます。これなしでは、UBOバック付きシェーダー (したがってWebGPU) は最初の使用時にエラーを投げます。
カスタムフィルター
Filter.from({ gl, resources }) は短縮形です。フラグメントシェーダーのみを渡します。PixiJSは、出力フレーム配置を処理するデフォルトバーテックスシェーダーを提供します。
import { Filter } from "pixi.js";
const filter = Filter.from({
gl: {
fragment: `
in vec2 vTextureCoord;
out vec4 finalColor;
uniform sampler2D uTexture;
uniform float uStrength;
void main(void) {
vec4 color = texture(uTexture, vTextureCoord);
finalColor = mix(color, vec4(1.0 - color.rgb, color.a), uStrength);
}
`,
},
resources: {
filterUniforms: {
uStrength: { value: 0.5, type: "f32" },
},
},
});
filter.resources.filterUniforms.uniforms.uStrength = 1.0;
カスタムバーテックスシェーダーの場合、new Filter({ glProgram: new GlProgram({ vertex, fragment }), resources }) を使用します。
フィルターシェーダーの規約 (GLSL ES 3.0)
varying vec2 vTextureCoord;の代わりにin vec2 vTextureCoord;gl_FragColorの代わりにout vec4 finalColor;texture2D(uTexture, uv)の代わりにtexture(uTexture, uv)- デフォルトバーテックスシェーダーは
uInputSize、uOutputFrame、uOutputTextureおよびヘルパーfilterVertexPosition()/filterTextureCoord()を公開します
フィルターの背後にあるレンダーターゲットのサンプリング
blendRequired: true を設定し、フラグメントシェーダーで uBackTexture をサンプリングします。PixiJSはフィルターを実行する前に、ピクセルをそのユニフォームにコピーします:
const blendFilter = Filter.from({
gl: { fragment: blendFragSrc },
resources: { uniforms: { uAmount: { value: 0.5, type: "f32" } } },
blendRequired: true,
});
必要な場合にのみ blendRequired を有効にしてください。毎フレーム追加のGPUコピーを強制します。
実行時にユニフォームを更新する
// リソースを通じてUniformGroupにアクセス
shader.resources.myUniforms.uniforms.uTime = performance.now() / 1000;
// isStatic UBOの場合、値を変更した後に update() を呼び出す
shader.resources.myUniforms.update();
ユニフォーム型リファレンス
サポートされている型の完全な表、WGSL/GLSL同等物、および値形式については、references/uniform-types.md を参照してください。
カスタムBatcher (拡張ベース)
Batcher 抽象クラスは、特殊なレンダリング用のカスタムバッチングを有効にします。サブクラス化し、拡張を通じて登録します:
import { Batcher, extensions, ExtensionType } from "pixi.js";
import type {
BatcherOptions,
BatchableMeshElement,
BatchableQuadElement,
Geometry,
Shader,
} from "pixi.js";
class MyBatcher extends Batcher {
public static extension = {
type: [ExtensionType.Batcher],
name: "my-batcher",
};
public name = "my-batcher";
protected vertexSize = 6; // 頂点あたりのfloat数
public geometry: Geometry;
public shader: Shader;
constructor(options: BatcherOptions) {
super(options);
// ジオメトリとシェーダーを初期化
}
public packAttributes(
element: BatchableMeshElement,
float32View: Float32Array,
uint32View: Uint32Array,
index: number,
textureId: number,
): void {
// メッシュの頂点属性をバッチバッファーにパック
}
public packQuadAttributes(
element: BatchableQuadElement,
float32View: Float32Array,
uint32View: Uint32Array,
index: number,
textureId: number,
): void {
// クワッド頂点属性をバッチバッファーにパック
}
}
extensions.add(MyBatcher);
要素は batcherName によってBatcherを参照します。BatchableElement インターフェースには、batcherName、texture、blendMode、indexSize、attributeSize、topology、および packAsQuad が必要です。
よくある間違い
[重大] 古い Shader.from(vertex, fragment, uniforms) コンストラクター
間違い:
const shader = Shader.from(vertex, fragment, { uTime: 1 });
正しい:
const shader = Shader.from({
gl: { vertex, fragment },
resources: {
uniforms: new UniformGroup({
uTime: { value: 1, type: "f32" },
}),
},
});
v8では、gl/gpu プログラムと resources を含むオプションオブジェクトが必要です。位置引数APIは削除されました。
[重大] 型注釈のないUniformGroup
間違い:
new UniformGroup({ uTime: 1 });
正しい:
new UniformGroup({ uTime: { value: 1, type: "f32" } });
すべてのユニフォームには、明示的な { value, type } ペアが必要です。型を省略すると、実行時エラーが発生します: "Uniform type undefined is not supported."
[高] サポートされていない型または間違った構造を持つUBO
UBOモードは、f32 および i32 ベースの型 (スカラーとベクトル) をサポートしています。u32 はサポートされているUniformGroup型リストにはなく、エラーを投げます。行列はfloatのみです (mat*<f32>)。サンプラーはUBOに置くことはできません。
構造名とフィールド順序は、シェーダーのUBO宣言と正確に一致する必要があります。不一致は、エラーなしでガベージレンダリングを生成します。
[高] UniformGroupにテクスチャを配置する
間違い:
new UniformGroup({
uTexture: { value: texture, type: "f32" },
});
正しい:
const shader = Shader.from({
gl: { vertex, fragment },
resources: {
uTexture: texture.source,
uSampler: texture.source.style,
myUniforms: new UniformGroup({
uAlpha: { value: 1.0, type: "f32" },
}),
},
});
テクスチャはリソースであり、ユニフォームではありません。texture.source (TextureSource) と texture.source.style (TextureStyle) をトップレベルのリソースエントリとして渡します。
APIリファレンス
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- pixijs
- リポジトリ
- pixijs/pixijs-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/pixijs/pixijs-skills / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。