0

私は PBR シェーダーを作成しており、画像の出力であるアルファ値を生成する正しい方法を決定しようとしています。目標は、「あらかじめ乗算されたアルファ」である最終画像を作成することです。これにより、後で別のオーバー合成操作で使用できます (たとえば、別の背景画像の上に合成します)。これは、透明なサーフェス上のスペキュラ ハイライトの場合を除いて、すべてうまく機能します。

この記事を読む: https://google.github.io/filament/Filament.md.html#lighting/transparencyandtranslucencylighting

特に:

窓を観察すると、拡散反射が透明であることがわかります。一方、鏡面反射率が明るいほど、ウィンドウの不透明度は低くなります。この効果は図 63 で見ることができます。シーンはガラスの表面に適切に反射されていますが、太陽の反射ハイライトは十分に明るく、不透明に見えます。

また、コード スニペットも含まれています。

// baseColor has already been premultiplied
vec4 shadeSurface(vec4 baseColor) {
    float alpha = baseColor.a;

    vec3 diffuseColor = evaluateDiffuseLighting();
    vec3 specularColor = evaluateSpecularLighting();    

    return vec4(diffuseColor + specularColor, alpha);
}

ガラスをレンダリングする場合、メタリック レベルは 0 になるため、baseColor からまったくプルせず、スペキュラー レベルを使用するだけです。これはすべて理にかなっており、上記の引用のように、透明なガラス上でもスペキュラー ハイライトが発生する可能性があることを意味します。baseColor テクスチャは、デカールを含むものなど、既に乗算済みのアルファ イメージであるため、最後に単にアルファを乗算したくはありません。たとえば、「A」という文字のステッカーが貼られたガラス板を描いているとします。

私の質問は、ガラスの透明な部分にスペキュラー ハイライトがあるピクセルの場合、合成が下流で機能するためにはアルファ値がどうあるべきかということです。上記のコードによると、アルファは 0 になり、後で Over 操作がうまく動作しなくなります。事前に乗算されたアルファのプロパティは max(R,G,B) <= A であるため、これを言いますが、このスペキュラー ハイライトは max(R,G,B) > A になります。スペキュラー ハイライトとそれが合成される背景との間の加算で、最終的な画像が吹き飛ばされます。これらのピクセルにより有用なアルファ値を与えるために、アルファを max(specular, alpha) に設定する必要がありますか? これを処理するためのより「正しい」方法はありますか? ありがとう

4

1 に答える 1