リニアワークフロー
現代のレンダリングエンジンでは、物理的に正確なライティングと色表現を実現するために、リニアワークフローが不可欠です。このアプローチにより、シェーディングからポストプロセスまでのすべての計算がリニア色空間で行われることが保証され、ガンマ圧縮されたテクスチャや不正確なブレンドによって引き起こされるエラーを防ぎます。リニア空間で作業し、最終出力段階でのみガンマ補正を適用することで、ライティング、テクスチャ、エフェクト全体の一貫性が保たれ、よりリアルで予測可能なビジュアルが得られます。
エンジンv1では、リニアワークフローはStandardMaterial
に限定されていましたが、エンジンv2では、すべてのシェーダーとレンダリングステージ(ShaderMaterial
、UIレンダリング、パーティクル、およびその他すべての要素を含む)に完全に統合されており、全体を通して一貫した物理的に正確な色処理を保証します。
シェーダーの入力と出力の処理
適切なリニアワークフローは、シェーダー内のすべての色計算が物理的に正確な方法で行われることを保証します。これは、レンダリングパイプライン全体で正確さを維持するために、入力と出力の両方を慎重に処理する必要があることを意味します。
シェーダー入力: リニアデータの保証
シェーダーは、不正確なライティング結果を避けるために、すべての入力値がリニア空間にあることを要求します。これは、テクスチャとユニフォームカラー値の両方に影響します。
- テクスチャ(アルベドマップのような)色データを格納するものは、
**sRGB**
としてマークされるべきです。テクスチャがサンプリングされると、GPUはsRGBエンコードされた値を自動的にリニア空間に変換し、正確な色計算を保証します。 - カラーユニフォームは、
StandardMaterial
、パーティクルレンダリング、およびその他の組み込みレンダリングシステムでは、ガンマ空間からリニア空間に自動的に変換されます。ただし、Material.setParameter
またはMeshInstance.setParameter
を使用してユニフォームを手動で設定する場合、値がリニア空間で提供されていることを確認するのは呼び出し元の責任です。これは、すべてのパラメーターがsetParameter
を使用して明示的に定義される必要があるShaderMaterial
にとって特に重要です。これを支援するために、Color
クラスはガンマ空間の色をリニア空間に変換するColor.linear()
関数を提供します。
すべての入力がリニア空間になると、シェーダーは物理的に正確な結果でライティング計算を実行します。
シェーダー出力: ガンマ補正の管理
最終的な色出力を書き込む際、ガンマ補正の処理は、レンダリングがLDR(Low Dynamic Range)であるかHDR(High Dynamic Range)であるかによって異なります。
- LDRレンダリング: 色がレンダーターゲットに書き込まれる前にシェーダー内で直ちにガンマ補正され、標準モニターで正しく表示されるようにします。
- HDRレンダリング: 色がレンダーターゲットに書き込まれる際、リニア空間のままとなり、通常、精度を保持しバンディングを避けるために
**浮動小数点形式**
(例:RGBA16F
またはRGBA32F
)を必要とします。ガンマ補正はその後、通常は最終的なトーンマッピングまたはポストプロセス段階で適用され、ブルームやカラーグレーディングなどのエフェクトが高精度なリニアHDRカラーで機能するようにします。
この構造化されたアプローチは、ライティング、ブレンド、ポストプロセスが一貫して動作することを保証し、よりリアルで予測可能なレンダリング結果をもたらします。