カラーワークフロー

線形および非線形ガンマカラースペース

sRGBカラースペースの目的は、コンピュータモニター上で表示するための色を表現することです。現在、sRGBは非線形ガンマカラースペースの標準です。これは、人間の光の知覚が非線形であり、コンピュータモニターが光の強度に対して非線形の応答を示すために必要です。

人間の目は、明るい色合いよりも暗い色合いをよりよく区別します。このため、画面上で画像を保存および表示する際には、暗い強度に対してより高い精度を保持することが理にかなっています。非線形ガンマカラースペースは、ガンマ補正を使用してこれを実現します。これは、画像内の各ピクセルの強度をべき関数に通すことによって行われます。

\[I^{\gamma}\]

画像は通常、エンコーディングガンマが適用された状態で保存され、スクリーンはデコードガンマを適用します。この画像は、Kanzi が線形色空間とガンマ色空間の間で変換するために使用するガンマ転送関数のグラフを示しています。

../../_images/gamma.svg

この画像は、画面から放射される光の強度が線形に増加するグラデーションを示しています。

../../_images/linear_emitted_intensity.png

上記のグラデーションにデコードガンマを適用すると、知覚的な光の強度が線形に増加するこのグラデーションになります。

../../_images/linear_perceptual_intensity.png

非線形ガンマカラースペースの問題は、グラフィックス操作に適していないことです。非線形スペースで色の計算を行うと、色とアルファブレンディングで不正確な結果をもたらします。数学的に正しいライティングとカラーブレンディングの計算には、線形カラースペースが必要です。

線形カラー空間では、数値の強度値が実際の強度に対応しているため、色の値を正しく加算および乗算することが可能です。線形カラー空間レンダリングは、特に物理ベースのレンダリング技術において、より正確な結果とより現実的な表面シェーディングを提供します。

これらの画像は、非線形ガンマ(左)と線形(右)のカラースペースでのブレンドの例を示しています。非線形ガンマカラースペースでのブレンドは、過度に明るいブレンドと飽和したバンドを引き起こします。

../../_images/legacy-blending.png ../../_images/linear-blending.png

Kanzi はデフォルトでリニアカラーのワークフローを使用し、Kanzi はリニアカラー空間で色の値を操作します。リニアカラーのワークフローを使用する と レガシーカラーワークフローからリニアカラーワークフローへのアプリケーションの変換 を参照してください。

Kanzi は、非線形ガンマまたはレガシーカラーワークフローもサポートしており、Kanzi はガンマカラースペースで色値を操作します。レガシーカラーワークフローを使用する を参照してください。

リニアカラーのワークフローを使用する

デフォルトで、Kanzi はリニアカラーのワークフローを使用します。これにより、現実的なライティング計算と正しい色のブレンディングが可能になります。色と光の正確なレンダリングを実現するために、Kanzi はすべての色の値をリニアカラー空間に変換してから、それらに対して操作を行います。その後、Kanzi は色の値をストレージまたは表示のためにガンマカラー空間に戻します。

イメージ (Images)

Kanzi Studio プロジェクトで線形カラー ワークフロー用に画像を構成するには:

  • Library > Resource Files > Images で、ASTC、ETC2、JPEG、PNG、または PVRTC 形式を使用する各画像リソースに対して、sRGB Content プロパティの値を設定します。

    • 画像にsRGBカラ情報が含まれている場合、sRGB Content プロパティを有効に設定します。これはデフォルトの設定です。

      sRGBカラー情報を含む画像の sRGB Content プロパティを無効にすると、Kanzi がその画像を使用するテクスチャを予想以上に明るくレンダリングすることがあります。

    • 画像に法線、粗さ、またはオクルージョンマップなどの非カラー情報が含まれている場合は、sRGB Content プロパティを無効に設定してください。

      非色情報を含むテクスチャはリニアフォーマットで保存されます。sRGB Content プロパティを無効にすることで、Kanzi を設定し、カラースペース変換を行わずにイメージデータをシェーダーに直接渡します。

    ../../_images/srgb-content.png
  • Kanzi はデフォルトで、線形色空間で画像のアルファチャンネルをプリマルチプライ処理します。画像の色空間でアルファチャンネルをプリマルチプライ処理するには、Library > Resource Files > Images で画像を選択し、Properties で Linear Premultiply プロパティを無効にします。サードパーティツールでの画像の準備 を参照してください。

    ../../_images/linear-premultiply.png

カラー プロパティ バインディング

リニアカラーワークフローでバインディング式に色の値を設定するには:

  • Color4 の値を sRGB カラースペースで指定します。color4 を参照してください。

    例:

    Color4(0, 0.75, 0.25, 1)
    
    ../../_images/r0g192b64.png
  • 個々のRGBカラーチャンネルの値を線形カラー空間で指定します。

    sRGBToLinear バインディング関数を使用して、色チャンネルの値を線形色空間に変換します。

    例:

    • このバインディング式は Color4(0, 0.75, 0.25, 1) と等しいです。

      color = Color4(0, 0, 0, 1)
      color.g = sRGBToLinear(0.75)
      color.b = sRGBToLinear(0.25)
      color
      
      ../../_images/r0g192b64.png
    • このバインディング式は Color4(0, 0.879, 0.535, 1) と等しいです。

      color = Color4(0, 0, 0, 1)
      color.g = 0.75
      color.b = 0.25
      color
      
      ../../_images/r0g225b137.png

シェーダー

線形カラー ワークフローでは、シェーダーはカラー入力が線形カラー空間であることを期待し、線形カラー空間でカラーを出力します。8 ビット/チャンネルのテクスチャ形式でカラー値を保存する際の精度を維持するために、Kanzi は保存する前にカラー値を sRGB カラー空間に戻します。

グラフィックスAPI

リニアカラーのワークフローには、以下が必要です:

  • OpenGL拡張 GL_EXT_sRGB を使用して、sRGBモードでフレームバッファを作成できるようにします。

  • EGL バージョン 1.5 以降、または EGL_KHR_gl_colorspace 拡張機能を持つ EGL バージョン 1.4。

線形カラー ワークフローを使用するには、Project > Properties で Target Graphics API が OpenGL ES 2.0 Extension Pack 以上に設定されていることを確認してください。デフォルト値は OpenGL ES 2.0 Extension Pack です。

レガシーカラーワークフローを使用する

レガシーカラーワークフローでは、Kanzi が非線形ガンマカラースペースで色の値に対して操作を行います。これは、線形カラーワークフローよりも精度の低いレンダリング結果を提供します。

次の場合は、レガシーカラーワークフローを使用します:

  • リニアカラースペースをサポートしないデバイスにアプリケーションをデプロイします。

    線形カラー空間をサポートするには、ターゲットプラットフォームがEGLバージョン1.5以降、またはEGL_KHR_gl_colorspace拡張機能を備えたEGLバージョン1.4を実装している必要があります。

    その後、Kanzi は Legacy 色空間を使用して EGL ウィンドウサーフェスの作成を再試行します。フォールバックが成功した場合、アプリケーションはレガシー色空間を使用し続けます。

    Kanzi が Legacy 色空間を使用して EGL ウィンドウサーフェスを作成できない場合、要求された色空間と EGL エラーコードを含むエラーを報告します。この場合は、レガシーカラーワークフローを使用するようにアプリケーションを設定してください。

  • Kanzi の以前のバージョンからプロジェクトを移行する。

レガシーカラーワークフローでは、Kanzi はカラー入力を変換しません。Kanzi Engine API を使用して ColorRGBA オブジェクトを作成する場合、sRGB カラースペースで色の値を提供してください。

レガシーカラーワークフローを使用するには:

  1. アプリケーションを未指定のカラースペースを使用するように設定するには、次のいずれかを設定します。

    • application.cfg で:

      SurfaceColorSpace = "legacy"
      
    • Application::onConfigure 関数内のC++アプリケーションで:

      configuration.defaultSurfaceProperties.colorSpace = "legacy";
      

    SurfaceColorSpace を参照してください。

  2. Project > Properties の Kanzi Studio で、Color Workflow プロパティを Legacy に設定します。

    ../../_images/project-properties.png ../../_images/color-workflow-legacy.png
  3. シェーダーを記述して、ターゲットディスプレイのガンマ空間で色を出力するようにしてください。これはおそらくsRGBです。シェーダー を参照してください。

レガシーカラーワークフローからリニアカラーワークフローへのアプリケーションの変換

アプリケーションを従来のカラーワークフローから線形カラーワークフローに変換するには、

  1. アプリケーションをsRGBカラースペースを使用するように設定するには、次を削除します:

    • application.cfg で:

      SurfaceColorSpace = "legacy"
      
    • Application::onConfigure 関数内のC++アプリケーションで:

      configuration.defaultSurfaceProperties.colorSpace = "legacy";
      

    その構成を削除すると、Kanzi は SurfaceColorSpace にデフォルト値 srgb を使用します。SurfaceColorSpace を参照してください。

  2. Project > Properties セットの Kanzi Studio 内で:

    • Color Workflow から Linear へ

    • Target Graphics API を OpenGL ES 2.0 Extension Pack 以上に

    ../../_images/project-properties.png ../../_images/color-workflow-linear.png ../../_images/target-graphics-opengl-es-2.0-extension-pack.png
  3. Library > Materials and Textures > Material Types の各マテリアルタイプにおいて、以下を確認してください。

    • バインディングには、不要な手動で追加されたsRGB変換が含まれていません。

      例えば、色の値を線形カラー空間からsRGBカラー空間に変換するために linearTosRGB バインディング関数を使用する必要はありません。線形カラーのワークフローでは、シェーダーは色の入力が線形カラー空間であることを期待します。

    • シェーダーは、入力または出力でガンマ補正を適用しません。

      リニアカラーのワークフローでは、シェーダーはカラー入力がリニアカラースペースであることを期待し、リニアカラースペースでカラーを出力します。

  4. Library > Resource Files > Images で、ASTC、ETC2、JPEG、PNG、または PVRTC 形式を使用する各画像リソースについて、sRGB Content プロパティが正しく設定されていることを確認してください。

    • 画像にsRGBカラ情報が含まれている場合、sRGB Content プロパティを有効に設定します。これはデフォルトの設定です。

      sRGBカラー情報を含む画像の sRGB Content プロパティを無効にすると、Kanzi がその画像を使用するテクスチャを予想以上に明るくレンダリングすることがあります。

    • 画像に法線、粗さ、またはオクルージョンマップなどの非カラー情報が含まれている場合は、sRGB Content プロパティを無効に設定してください。

      非色情報を含むテクスチャはリニアフォーマットで保存されます。sRGB Content プロパティを無効にすることで、Kanzi を設定し、カラースペース変換を行わずにイメージデータをシェーダーに直接渡します。

    ../../_images/srgb-content.png
  5. 目的の色のブレンド結果を得るために、必要に応じてプロジェクト内の部分的に透明な色を調整してください。

    例えば、これらのカラーブラシで塗りつぶされたノードは、レガシーとリニアのカラーワークフローモードで異なって見えます。

    ../../_images/red-green-blue-brushes.png

    Legacy カラーワークフロー

    Linear カラーワークフロー

    ../../_images/color-brush-blending-legacy.png ../../_images/color-brush-blending-linear.png

関連項目

アプリケーション開発

マテリアルタイプとマテリアル

シェーダー

イメージ (Images)

テクスチャ (Textures)

バインディング式リファレンス