Shader Chunk Migrations
イントロダクション
PlayCanvas エンジンのマテリアルシェーダチャンクシステムは、 より柔軟なマテリアルシステムをサポートするために、大幅な変更が加えられています。詳細については、このページを参照してください。
このページでは、既存のカスタム シェーダー チャンクの移行を支援するために、チャンクに加えられた変更点をエンジン リリース別(v1.51 以降)にリストアップしています。
チャンク API バージョン
エンジンのデバッグバージョンは、オーバーライドされたチャンクを検出すると、ランタイムコンソールに API の変更を報告します。例えば
アプリケーションのチャンクが最新の API に更新されたら、そのようにフラグを立てる必要があります。例えば、マテリアルのカスタムチャンクを最新のエンジンリリース (例えば v1.55) に更新した後、次のようにチャンクオブジェクトで指定します。
material.chunks.diffusePS = '...';
material.chunks.APIVersion = pc.CHUNKAPI_1_55;
このようにすることで、コンソールに警告メッセージが表示されなくなります。
チャンクの変更
次の表は、Engine リリースごとのチャンクの変更点をまとめたものです。
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
}
これにより、エンジンは自動的に使用するサンプラーユニフォームを選択することができ、その結果、サンプラーの総数を減らすことができる可能性があります。しかし、これはフロントエンドチャンクにのみサポートされていることに注意してください。