Shader Chunk Migrations
イントロダクション
PlayCanvas エンジンのマテリアルシェーダチャンクシステムは、より柔軟なマテリアルシステムをサポートするために、大幅な変更が加えられています。詳細については、このページを参照してください。
このページでは、既存のカスタム シェーダー チャンクの移行を支援するために、チャンクに加えられた変更点をエンジン リリース別(v1.51 以降)にリストアップしています。
チャンク API バージョン
エンジンのデバッグバージョンは、オーバーライドされたチャンクを検出すると、ランタイムコンソールに API の変更を報告します。例えば

アプリケーションのチャンクが最新の API に更新されたら、そのようにフラグを立てる必要があります。例えば、マテリアルのカスタムチャンクを最新のエンジンリリース (例えば v1.55) に更新した後、次のようにチャンクオブジェクトで指定します。
material.chunks.diffusePS = '...';
material.chunks.APIVersion = pc.CHUNKAPI_1_55;
このようにすることで、コンソールに警告メッセージが表示されなくなります。
チャンクの変更
次の表は、Engine リリースごとのチャンクの変更点をまとめたものです。
Engine v2.20
MSDF テキストレンダリングの刷新
ElementComponent のテキストで使用される msdfPS チャンクが刷新され、グリフを本来の(デザイナーが意図した)エッジでレンダリングし、距離フィールドの勾配からアンチエイリアスを行うようになりました。これにより、f の横棒など細い接合部を崩していた固定的な内側への収縮(erosion)が修正されました。詳細は PR #8935 を参照してください。
この変更に伴い、エンジンは font_pxrange および font_textureWidth ユニフォームを設定しなくなり、map() ヘルパーがチャンクから削除されました。以前のリリースからコピーしたカスタムの msdfPS オーバーライドがこれらのユニフォームを参照している場合、それらの値が渡されなくなり(既定値の 0 となり、従来のスムージング計算でゼロ除算が発生します)、テキストが壊れたり表示されなくなったりします。
影響を受けるチャンク:
src/scene/shader-lib/glsl/chunks/common/frag/msdf.jssrc/scene/shader-lib/wgsl/chunks/common/frag/msdf.js
移行方法: カスタムの msdfPS オーバーライドを最新のチャンクに合わせて更新してください。font_pxrange、font_textureWidth、map() への参照を削除し、新しいエッジ/アンチエイリアスのロジックを採用します。意図的なウェイト調整は、グローバルなしきい値のバイアスではなく、フォントごとの font_sdfIntensity(または outlineThickness)を使用してください。
Engine v2.16
Gaussian Splat アクセサ関数の名称変更
gsplat シェーダーのアクセサ関数が、API の一貫性のために名称変更されました。すべての関数が getXXX() という命名パターンを使用するようになりました。
| 旧 | 新 |
|---|---|
readCenter(source) | getCenter() |
readColor(source) | getColor() |
注意: getCenter() は、他の関数が使用する共有データを読み込むため、getRotation()、getScale()、getColor() よりも先に呼び出す必要があります。source パラメータは不要になりました。
影響を受けるチャンク:
src/scene/shader-lib/glsl/chunks/gsplat/vert/gsplat.jssrc/scene/shader-lib/wgsl/chunks/gsplat/vert/gsplat.js
gsplatCustomizeVS チャンクの削除
gsplatCustomizeVS シェーダーチャンクは v2.16 で削除されました。これは v2.15 で gsplatModifyVS の導入に伴い非推奨となっていたものです。gsplatCustomizeVS を引き続き使用しているコードは、チャンクが削除されたという警告が表示されるようになります。
旧来の共分散ベースのヘルパー関数(gsplatExtractSize、gsplatApplyUniformScale、gsplatMakeRound)も gsplatHelpers.js から削除されました。
移行方法:
下記の v2.15 移行ガイドに記載されているとおり、gsplatModifyVS へ移行する必要があります。完全な移行手順については v2.15 移行ガイド を参照してください。
Engine v2.15
Gaussian Splat シェーダーのカスタマイズ
gsplatCustomizeVS シェーダーチャンクは非推奨となり、gsplatModifyVS に置き換えられました。新しいチャンクは、共分散行列の代わりに回転クォータニオンとスケールベクトルを使用する、より効率的な API を提供します。詳細は PR #8246 を参照してください。
旧 (gsplatCustomizeVS) | 新 (gsplatModifyVS) |
|---|---|
modifyCenter(inout vec3 center) | modifySplatCenter(inout vec3 center) |
modifyCovariance(originalCenter, modifiedCenter, inout covA, inout covB) | modifySplatRotationScale(originalCenter, modifiedCenter, inout rotation, inout scale) |
modifyColor(center, inout color) | modifySplatColor(center, inout color) |
ヘルパー関数の変更:
| 旧 | 新 |
|---|---|
gsplatApplyUniformScale(covA, covB, scale) | scale *= factor(直接乗算) |
gsplatExtractSize(covA, covB) | gsplatGetSizeFromScale(scale) |
gsplatMakeRound(covA, covB, radius) | gsplatMakeSpherical(scale, radius) |
移行例 (GLSL):
変更前:
void modifyCenter(inout vec3 center) {
center.y += 1.0;
}
void modifyCovariance(vec3 originalCenter, vec3 modifiedCenter, inout vec3 covA, inout vec3 covB) {
gsplatApplyUniformScale(covA, covB, 2.0);
}
void modifyColor(vec3 center, inout vec4 color) {
color.rgb *= 0.5;
}
変更後:
void modifySplatCenter(inout vec3 center) {
center.y += 1.0;
}
void modifySplatRotationScale(vec3 originalCenter, vec3 modifiedCenter, inout vec4 rotation, inout vec3 scale) {
scale *= 2.0;
}
void modifySplatColor(vec3 center, inout vec4 color) {
color.rgb *= 0.5;
}
JavaScript での使用例:
// 変更前
gsplatMaterial.getShaderChunks(shaderLanguage).set('gsplatCustomizeVS', customShader);
// 変更後
gsplatMaterial.getShaderChunks(shaderLanguage).set('gsplatModifyVS', customShader);
Engine v2.6
Internal engine chunks
The following vertex shader chunks were removed and replaced by a single litMainVS chunk:
endVSstartVSbaseVSviewNormalVSbaseNineSlicedVS
lightmapDirAddPS chunk has been removed, and its functionality integrated into lightmapAddPS chunk.
TBNderivativePS and TBNObjectSpacePS chunks were removed, and their functionality integrated into TBNPS chunk.
startPS chunk has been removed, and a replacement larger chunk will be added at a later stage.
outputAlphaOpaquePS and outputAlphaPremulPS chunks were merged into outputAlphaPS chunk.
cubeMapProjectBoxPS and cubeMapProjectNonePS chunks were merged into cubeMapProjectPS chunk.
envMultiplyPS and envConstPS were merged into envProcPS chunk.
aoSpecOccSimplePS, aoSpecOccConstSimplePS, aoSpecOccPS and aoSpecOccConstPS chunks were merged into aoSpecOccPS chunk.
shadowSampleCoordPS chunk has been removed, and its content is now part of lightFunctionPS chunk.
The following reflection related chunks had a slight change in how the texture decode function is provided. $DECODE is now {reflectionDecode} and $DECODE_CUBEMAP is now {reflectionCubemapDecode}. These chunks were affected:
reflectionEnvPSreflectionEnvHQPSreflectionCubePSreflectionSpherePS
The following ambient lighting related chunks had been removed, and merged into a single ambientPS chunk:
ambientConstantPSambientEnvPSambientSHPS
Engine v2.5
The following chunks were removed and replaced by a single fogPS chunk:
fogExpPSfogExp2PSfogLinearPSfogNonePS
The following chunks were removed and replaced by a single gammaPS chunk:
gamma1_0PSgamma2_2PS
Engine v1.70
| Chunk | Changes |
|---|---|
refractionDynamicPS |
|
refractionCubePS |
|
Engine v1.65
In 1.62, global variables used to pass the values between the front end back end chunks were grouped into structures LitShaderArguments, IridescenceArgs, ClearcoatArgs and SheenArgs. Those were causing multiple compatibility issues on Android devices, and so in 1.65, these are being converted back to global variables. For example litShaderArgs.albedo is now litArgs_albedo.
These are the new global variables:
// Surface albedo absorbance
vec3 litArgs_albedo;
// Transparency
float litArgs_opacity;
// Emission color
vec3 litArgs_emission;
// Normal direction in world space
vec3 litArgs_worldNormal;
// Ambient occlusion amount, range [0..1]
float litArgs_ao;
// Light map color
vec3 litArgs_lightmap;
// Light map direction
vec3 litArgs_lightmapDir;
// Surface metalness factor, range [0..1]
float litArgs_metalness;
// The f0 specularity factor
vec3 litArgs_specularity;
// Specularity intensity factor, range [0..1]
float litArgs_specularityFactor;
// The microfacet glossiness factor, range [0..1]
float litArgs_gloss;
// Glossiness of the sheen layer, range [0..1]
float litArgs_sheen_gloss;
// The color of the f0 specularity factor for the sheen layer
vec3 litArgs_sheen_specularity;
// Transmission factor (refraction), range [0..1]
float litArgs_transmission;
// Uniform thickness of medium, used by transmission, range [0..inf]
float litArgs_thickness;
// Index of refraction
float litArgs_ior;
// Iridescence effect intensity, range [0..1]
float litArgs_iridescence_intensity;
// Thickness of the iridescent microfilm layer, value is in nanometers, range [0..1000]
float litArgs_iridescence_thickness;
// The normal used for the clearcoat layer
vec3 litArgs_clearcoat_worldNormal;
// Intensity of the clearcoat layer, range [0..1]
float litArgs_clearcoat_specularity;
// Glossiness of clearcoat layer, range [0..1]
float litArgs_clearcoat_gloss;
These are the chunk that had their signature changed to accept individual members, instead of the whole structures:
- endPS
- metalnessModulatePS
- outputAlphaPS
- outputAlphaPremulPS
- fresnelSchlickPS
- iridescenceDiffractionPS
- lightmapAddPS
- lightmapDirAddPS
- refractionCubePS
- refractionDynamicPS
Engine v1.62
PlayCanvasには、2つのシェーダーチャンクがあります。1つはシェーダーフロントエンドと呼ばれ、ライティングアルゴリズムに渡される引数の値を提供します。もう1つはシェーダーバックエンドと呼ばれ、またライティングアルゴリズムとも呼ばれます。
1.62では、これら2つの間に明確な区別を作成し、バックエンドに渡される値が事前に明確に定義され、自動生成されないようにします。これにより、ネイティブのマテリアルと同様に、ライティングコードとインターフェースすることができる完全にカスタム化されたシェーダーを作成できます。
その結果、ほとんどのバックエンドチャンクが変更され、分割に対応するようになりました。これは、カスタムバックエンドシェーダーチャンクがグローバル変数を使用するのではなく、ライティングバックエンドから渡された引数を使用するように移行する必要があることを意味します。
この変更により、クリアコートの特定のチャンクなど、いくつかのチャンクは不要になりました。これらの機能は、グローバル値に依存しなくなったため再利用できるようになりました。
Changes
このリリースでは、ほとんどのライト/フラグメント・チャンクが変更されています。これらのチャンクのほとんどは、グローバル変数に依存する代わりに、必要な各種の値を受け入れるようにシグネチャが変更されました。ただし、ほとんどのグローバル変数はシェーダー内で設定されています。この変更の例を示します。
vec3 combineColor() {
vec3 ret = vec3(0);
ret = dAlbedo * dDiffuseLight;
...
}
は、次のように表されます。
vec3 combineColor(vec3 albedo, vec3 sheenSpecularity, float clearcoatSpecularity) {
vec3 ret = vec3(0);
ret = albedo * dDiffuseLight;
...
}
1.62では、以前グローバル変数だったものが構造体にパックされ、これらの構造体が主要なLitShaderArgsに定義されます。LitShaderArgsは次のように定義されます。
struct LitShaderArguments
{
// 透明度
float opacity;
// ワールド空間での法線方向
vec3 worldNormal;
// 表面の吸収率
vec3 albedo;
// 透過係数(屈折度), 範囲 [0..1]
float transmission;
// 厚さ, 透過で使用, 範囲 [0..inf]
float thickness;
// f0 スペキュラリティ係数
vec3 specularity;
// マイクロファセットの光沢係数 [0..1]
float gloss;
// 表面のメタリック係数 [0..1]
float metalness;
// スペキュラリティの強度係数 [0..1]
float specularityFactor;
// 環境遮蔽の量 [0..1]
float ao;
// 発光色
vec3 emission;
// ライトマップの色
vec3 lightmap;
// ライトマップの方向
vec3 lightmapDir;
// 虹彩効果拡張の引数
IridescenceArgs iridescence;
// クリアコート拡張の引数
ClearcoatArgs clearcoat;
// シーン拡張の引数
SheenArgs sheen;
};
最後の3つの引数が私たちのシェーディングの拡張機能です。IridescenceArgsは次のように定義されます。
struct IridescenceArgs
{
// 虹彩効果の強度、範囲 [0..1]
float intensity;
// 虹彩薄膜層の厚さ、値はナノメートル単位、範囲 [0..1000]
float thickness;
};
ClearcoatArgs:
struct ClearcoatArgs
{
// クリアコートレイヤーの強度、範囲 [0..1]
float specularity;
// クリアコートレイヤーの光沢度、範囲 [0..1]
float gloss;
// クリアコートレイヤーに使用される法線ベクトル
vec3 worldNormal;
};
SheenArgs:
struct SheenArgs
{
// Sheenレイヤーの光沢度 [0..1]
float gloss;
// Sheenレイヤーのf0スペキュラリティ係数の色
vec3 specularity;
};
| Chunk | Changes |
|---|---|
ambient(Constant/Env/SH) |
|
aoDiffuseOcc |
|
aoSpec(Occ/OccConst/OccConstSimple/OccSimple) |
|
combine |
|
clusteredLight |
|
clusteredLightShadow |
|
combine |
|
end |
|
fallOff(InvSquared/Linear) |
|
fresnelSchlick |
|
iridescenceDiffraction |
|
lightDiffuseLambert |
|
lightSheen |
|
lightSpecular(AnisoGGX/Blinn/Phong) |
|
lightmap(DirAdd/Add) |
|
ltc |
|
metalnessModulate |
|
output(Alpha/AlphaPremul) |
|
reflDir(Aniso) |
|
reflection(CC/Cube/Env/EnvHQ/Sphere/SphereLow) |
|
reflectionSheen |
|
refraction(Cube/Dynamic) |
|
shadow(Common/Coord/CoordPerspZBuffer |
|
shadow(EVSM/EVSMn/Standard/StandardGL2/VSM8) |
|
spot |
|
TBN(-/ObjectSpace/derivative/fast) |
|
Engine v1.60
| Chunk | Changes |
|---|---|
clearCoatGlossPS |
|
glossPS |
|
sheenGlossPS |
|
Engine v1.57
1.57 では、ほぼすべてのフロントエンドチャンクが、シェーダによって使用されるサンプラー の量を最小限に抑えるように変更されました。これはオプションの機能ですが、シェーダーが使用するサンプラーの量を減らすために、同じコーディングスタイルに従うことが推奨されます。以下のチャンクがその影響を受けます。
| Chunk |
|---|
aoPS |
clearCoatPS |
clearCoatGlossPS |
clearCoatNormalPS |
diffusePS |
diffuseDetailMapPS |
emissivePS |
metalnessPS |
normalMapPS |
normalDetailMapPS |
opacityPS |
parallaxPS |
sheenPS |
sheenGlossPS |
specularPS |
specularityFactorPS |
thicknessPS |
transmissionPS |
これは、カスタムフロントエンドチャンクでもサポートされており、チャンクが既存のマテリアルサンプラーをピギーバックしていることが前提です。あなたのチャンクでこの方法をサポートするために必要なことは、以下の通りです。
- チャンクからサンプラーユニフォーム宣言を削除してください。
- サンプラー名を
$SAMPLERマクロで置き換えます。
以下に例を示します。
uniform sampler2D texture_aoMap;
void getAO() {
dAo = 1.0;
#ifdef MAPTEXTURE
dAo *= texture2DBias(texture_aoMap, $UV, textureBias).$CH;
#endif
#ifdef MAPVERTEX
dAo *= saturate(vVertexColor.$VC);
#endif
}
に変換されるでしょう。
void getAO() {
dAo = 1.0;
#ifdef MAPTEXTURE
dAo *= texture2DBias($SAMPLER, $UV, textureBias).$CH;
#endif
#ifdef MAPVERTEX
dAo *= saturate(vVertexColor.$VC);
#endif
}
これにより、エンジンは自動的に使用するサンプラーユニフォームを選択することができ、その結果、サンプラーの総数を減らすことができる可能性があります。しかし、これはフロントエンドチャンクにのみサポートされていることに注意してください。
Engine v1.56
| Chunk | Changes |
|---|---|
combineXXXX |
|
refractionPS |
|
refractionCubePS |
|
refractionDynamicPS |
|
sheenPS |
|
sheenGlossPS |
|
reflectionEnvHQPS |
|
thicknessPS |
|
bakeDirLmEndPs |
|
bakeLmEndPS |
|
Engine v1.55
| Chunk | Changes |
|---|---|
clearCoatNormalPS |
|
clusteredLightPS |
|
combinePS |
|
combineXXXX |
|
diffusePS |
|
diffuseDetailMapPS |
|
endPS |
|
emissivePS |
|
fresnelSchlickPS |
|
lightmapSingleVert.js |
|
lightmapDirPS, lightmapSinglePS |
|
lightmapAddPS, lightmapDirAddPS |
|
lightSpecularAnisoGGXPS |
|
lightSpecularBlinnPS, lightSpecularPhongPS |
|
ltcPS |
|
normalMapFastPS |
|
normalMapPS |
|
normalDetailMapPS |
|
normalVertexPS |
|
metalnessPS |
|
metalnessModulatePS |
|
reflectionCC |
|
specularAaNonePS, specularAaToksvigPS, specularAaToksvigFastPS |
|
startPS |
|
specularPS |
|
specularityFactorPS |
|