メインコンテンツまでスキップ

光の推定

ARでは、現実世界は複雑な照明や様々な環境を持つことがあります。より良い没入感と、現実世界と仮想世界を融合させるために、仮想オブジェクトは光の推定データ(以下のようなもの)に基づいてシェーディングされ、照らされます。

  • 指向性ライト(最も顕著なもの)、その回転、強度、色。
  • 環境光(L3球面調和関数形式)。
  • 反射(キューブマップ形式)(現在未統合)。

サポート

システムが光の推定をサポートしているかどうかを確認できます。

if (app.xr.lightEstimation.supportedColor) {
// 光の推定へのアクセスがサポートされています
}

app.xr.lightEstimation.on('available', () => {
// 光の推定が利用可能になります
});

指向性ライト

光の推定が提供する最も基本的な情報は、最も顕著な指向性ライトの回転、強度、色です。

const lightEstimation = app.xr.lightEstimation;

// 光の推定が利用可能かを確認
if (lightEstimation.available) {
// エンティティを回転
entity.setRotation(lightEstimation.rotation());

// ライトのパラメータを設定
entity.light.intensity = lightEstimation.intensity;
entity.light.color = lightEstimation.color;
}

環境光

環境は通常、単一の指向性ライトよりもはるかに複雑であるため、光の推定はL3 SH(球面調和関数)形式で環境光情報を提供します。

SHを使用するには、マテリアルにプリフィルタリングされたキューブマップが適用されているか(シーンのスカイボックスも機能します)、または定数環境シェーダーチャンク(ambientConstantPS)を更新する必要があります。

マテリアルごとにSHデータを設定できます。

if (app.xr.lightEstimation.available) {
material.setParameter('ambientSH[0]', app.xr.lightEstimation.sphericalHarmonics);
}

シーンにプリフィルタリングされたキューブマップやスカイボックスがない場合は、マテリアルチャンクを更新できます。

material.chunks.ambientConstantPS = chunkCode;
material.update();

シェーダーチャンクコード:

uniform vec3 ambientSH[9];

void addAmbient(vec3 worldNormal) {
vec3 n = worldNormal;

vec3 color =
ambientSH[0] +
ambientSH[1] * n.x +
ambientSH[2] * n.y +
ambientSH[3] * n.z +
ambientSH[4] * n.x * n.z +
ambientSH[5] * n.z * n.y +
ambientSH[6] * n.y * n.x +
ambientSH[7] * (3.0 * n.z * n.z - 1.0) +
ambientSH[8] * (n.x * n.x - n.y * n.y);

dDiffuseLight += color;
}

反射

WebXR Light Estimationは、環境反射の推定をキューブマップ形式で提供しますが、現時点では PlayCanvas Engineには統合されていません。