組み込みシェーダーユニフォーム
PlayCanvas は、フォワードパスでメッシュを描画するときに、以下の数値ユニフォームを提供します。これらの名前に対して Material.setParameter() を呼び出すことなく、ShaderMaterial のシェーダーやカスタムマテリアルチャンクで使用できます。ユニフォームの値を自分で設定するには、シェーダーパラメーターを参照してください。
カメラの値は、現在描画しているカメラまたは XR ビューに対応します。この一覧はフォワードレンダリングを対象としています。シャドウ、ピッキング、コンピュート、独立したポストプロセスのパスでも同じ入力が設定されるとは限りません。
利用可能なユニフォーム
ユニフォームは頂点シェーダーとフラグメントシェーダーで読み取れます。使用する名前を以下の型で宣言してください。WGSL では uniform. プレフィックスを付けてアクセスします。
| ユニフォーム | GLSL 型 | WGSL 型 | 値 |
|---|---|---|---|
matrix_view | mat4 | mat4x4f | ワールド空間の位置をビュー空間に変換します。 |
matrix_viewInverse | mat4 | mat4x4f | matrix_view の逆行列。ビュー空間の位置をワールド空間に変換します。 |
matrix_view3 | mat3 | mat3x3f | matrix_view の左上の 3×3 部分。平行移動を適用せずに方向を変換します。 |
matrix_projection | mat4 | mat4x4f | ビュー空間の位置をクリップ空間に変換します。ジッター、レンダーターゲットの Y 反転、グラフィックスバックエンドの深度規約など、レンダラーによる射影の調整を含みます。 |
matrix_viewProjection | mat4 | mat4x4f | matrix_projection * matrix_view。ワールド空間の位置をクリップ空間に変換します。 |
view_position | vec3 | vec3f | ワールド空間のカメラ位置。XR では現在描画している目の位置です。 |
camera_params | vec4 | vec4f | カメラのクリップ面と投影の種類。1 / farClip、farClip、nearClip、および正投影カメラでは 1、透視投影カメラでは 0 です。深度値の線形化に使用します。 |
screen_size | vec4 | vec4f | キャンバスの描画バッファの幅、高さ、幅の逆数、高さの逆数。CSS サイズではなくピクセル単位です。 |
viewport_size | vec4 | vec4f | カメラのビューポートの幅、高さ、幅の逆数、高さの逆数(ピクセル単位)。レンダーターゲット、camera.rect、XR の各目のビューポートを考慮します。ビューポートの原点は含みません。 |
view_index | uint | u32 | 現在描画している XR ビューの 0 始まりのインデックス。深度テクスチャ配列のレイヤーなど、ビューごとのデータを選択するために使用します。 |
これらの射影行列は実際の描画に使用されるものです。ジッターやバックエンドの調整前にアプリケーションで計算した射影行列とは異なる場合があります。シェーダーでワールド空間の位置を射影する場合は matrix_viewProjection を使用してください。
matrix_model と matrix_normal はメッシュごとの入力であり、上記のカメラやシーンの値とは別です。スキニング、モーフィング、インスタンシングにも対応する変換には、頂点シェーダーチャンクを使用してください。
シーンの深度テクスチャとカラーテクスチャ(uSceneDepthMap と uSceneColorMap)については、Depthレイヤーを参照してください。
ユニフォームの宣言と読み取り
例えば、ワールド空間の方向をビュー空間に変換するには次のように記述します。
- GLSL
- WGSL
uniform mat3 matrix_view3;
vec3 directionToView(vec3 worldDirection) {
return matrix_view3 * worldDirection;
}
uniform matrix_view3: mat3x3f;
fn directionToView(worldDirection: vec3f) -> vec3f {
return uniform.matrix_view3 * worldDirection;
}
宣言の詳しい規則については、GLSL の詳細と WGSL リフレクションを参照してください。
画面サイズとビューポートサイズ
両方のサイズユニフォームは [width, height, 1 / width, 1 / height] という形式ですが、対象となる領域が異なります。
screen_sizeは常にキャンバスの描画バッファを表します。小さなオフスクリーンターゲットに描画しても変わりません。viewport_sizeは、現在のターゲット内のカメラのビューポートを表します。オフスクリーンターゲット、部分的なカメラ矩形、XR の各目のビューポートに応じて変化します。
1920×1080 のキャンバスで、カメラが 960×540 のターゲット全体に描画する場合、screen_size.xy は (1920, 1080)、viewport_size.xy は (960, 540) です。カメラがターゲットの幅の半分を占める場合、viewport_size.xy は (480, 540) になります。
screen_size を任意のテクスチャサイズを取得するために使用しないでください。部分的なビューポートのフレームバッファ座標を正規化するには、ビューポートの原点も考慮する必要があります。どちらのサイズユニフォームも原点は提供しません。