カラーワークフロー¶
線形および非線形ガンマカラースペース¶
sRGBカラースペースの目的は、コンピュータモニター上で表示するための色を表現することです。現在、sRGBは非線形ガンマカラースペースの標準です。これは、人間の光の知覚が非線形であり、コンピュータモニターが光の強度に対して非線形の応答を示すために必要です。
人間の目は、明るい色合いよりも暗い色合いをよりよく区別します。このため、画面上で画像を保存および表示する際には、暗い強度に対してより高い精度を保持することが理にかなっています。非線形ガンマカラースペースは、ガンマ補正を使用してこれを実現します。これは、画像内の各ピクセルの強度をべき関数に通すことによって行われます。
画像は通常、エンコーディングガンマが適用された状態で保存され、スクリーンはデコードガンマを適用します。この画像は、Kanzi が線形色空間とガンマ色空間の間で変換するために使用するガンマ転送関数のグラフを示しています。
この画像は、画面から放射される光の強度が線形に増加するグラデーションを示しています。
上記のグラデーションにデコードガンマを適用すると、知覚的な光の強度が線形に増加するこのグラデーションになります。
非線形ガンマカラースペースの問題は、グラフィックス操作に適していないことです。非線形スペースで色の計算を行うと、色とアルファブレンディングで不正確な結果をもたらします。数学的に正しいライティングとカラーブレンディングの計算には、線形カラースペースが必要です。
線形カラー空間では、数値の強度値が実際の強度に対応しているため、色の値を正しく加算および乗算することが可能です。線形カラー空間レンダリングは、特に物理ベースのレンダリング技術において、より正確な結果とより現実的な表面シェーディングを提供します。
これらの画像は、非線形ガンマ(左)と線形(右)のカラースペースでのブレンドの例を示しています。非線形ガンマカラースペースでのブレンドは、過度に明るいブレンドと飽和したバンドを引き起こします。
Kanzi はデフォルトで非線形ガンマ、つまり標準のカラーワークフローを使用します。このワークフローでは、Kanzi はガンマカラースペースのカラー値に対して演算を行います。標準カラーワークフローを使用する を参照してください。
Kanzi はリニアカラーワークフローもサポートしています。このワークフローでは、Kanzi はリニアカラースペースのカラー値に対して演算を行います。リニアカラーのワークフローを使用する および アプリケーションを標準カラーワークフローからリニアカラーワークフローに変換する を参照してください。
リニアカラーのワークフローを使用する¶
リニアカラーワークフローでは、Kanzi はリアルなライティング計算と正しいカラーブレンディングを実現します。色と光を正確にレンダリングするために、Kanzi はすべてのカラー値をリニアカラースペースに変換してから演算を行います。その後、Kanzi は保存または表示のためにカラー値をガンマカラースペースに戻します。
イメージ (Images)¶
Kanzi Studio プロジェクトで線形カラー ワークフロー用に画像を構成するには:
Library > Resource Files > Images で、ASTC、ETC2、JPEG、または PNG フォーマットを使用する各画像リソースの sRGB Content プロパティの値を設定します。
画像にsRGBカラ情報が含まれている場合、sRGB Content プロパティを有効に設定します。これはデフォルトの設定です。
sRGBカラー情報を含む画像の sRGB Content プロパティを無効にすると、Kanzi がその画像を使用するテクスチャを予想以上に明るくレンダリングすることがあります。
画像に法線、粗さ、またはオクルージョンマップなどの非カラー情報が含まれている場合は、sRGB Content プロパティを無効に設定してください。
非色情報を含むテクスチャはリニアフォーマットで保存されます。sRGB Content プロパティを無効にすることで、Kanzi を設定し、カラースペース変換を行わずにイメージデータをシェーダーに直接渡します。
Kanzi はデフォルトで、線形色空間で画像のアルファチャンネルをプリマルチプライ処理します。画像の色空間でアルファチャンネルをプリマルチプライ処理するには、Library > Resource Files > Images で画像を選択し、Properties で Linear Premultiply プロパティを無効にします。サードパーティツールでの画像の準備 を参照してください。
カラー プロパティ バインディング¶
リニアカラーワークフローでバインディング式に色の値を設定するには:
Color4の値を sRGB カラースペースで指定します。color4 を参照してください。例:
Color4(0, 0.75, 0.25, 1)
個々の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
このバインディング式は
Color4(0, 0.879, 0.535, 1)と等しいです。color = Color4(0, 0, 0, 1) color.g = 0.75 color.b = 0.25 color
シェーダー¶
線形カラー ワークフローでは、シェーダーはカラー入力が線形カラー空間であることを期待し、線形カラー空間でカラーを出力します。8 ビット/チャンネルのテクスチャ形式でカラー値を保存する際の精度を維持するために、Kanzi は保存する前にカラー値を sRGB カラー空間に戻します。
グラフィックスAPI¶
リニアカラーワークフローには、次のいずれかが必要です。
EGL バージョン 1.5 以降、または
EGL_KHR_gl_colorspace拡張機能を備えた EGL バージョン 1.4。Vulkan 1.1 以降。
標準カラーワークフローを使用する¶
デフォルトでは、Kanzi は標準カラーワークフローを使用します。このワークフローでは、非線形ガンマカラースペースのカラー値に対して演算を行います。そのため、リニアカラーワークフローよりもレンダリング結果の精度が低くなります。
次の場合は標準カラーワークフローを使用します。
リニアカラースペースをサポートしないデバイスにアプリケーションをデプロイします。
リニアカラースペースをサポートするには、ターゲットプラットフォームが EGL バージョン 1.5 以降、
EGL_KHR_gl_colorspace拡張機能を備えた EGL バージョン 1.4、または Vulkan 1.1 以降を実装している必要があります。Kanzi アプリケーションがリニアカラースペースを要求したが、ターゲットデバイスがそれをサポートしていない場合、結果として生じる動作はターゲットプラットフォームによって異なります。
例えば、あなたのアプリケーションは次のことができます:
EGL_GL_COLORSPACEのサポートがないことについての警告をログに出力し、レガシーカラースペースにフォールバックします。
次のエラーで終了します:
eglCreateWindowSurface() failed: EGL_BAD_ATTRIBUTE
Kanzi の以前のバージョンからプロジェクトを移行する。
標準カラーワークフローでは、Kanzi はカラー入力を変換しません。Kanzi Engine API を使用して ColorRGBA オブジェクトを作成する場合は、sRGB カラースペースでカラー値を指定してください。
標準カラーワークフローを使用するには、次の手順を実行します。
アプリケーションを未指定のカラースペースを使用するように設定するには、次のいずれかを設定します。
application.cfgで:SurfaceColorSpace = "standard"
Application::onConfigure関数内のC++アプリケーションで:configuration.defaultSurfaceProperties.colorSpace = "standard";
SurfaceColorSpace を参照してください。
Kanzi Studio の Project > Properties で、Color Workflow プロパティを Standard に設定します。
シェーダーを記述して、ターゲットディスプレイのガンマ空間で色を出力するようにしてください。これはおそらくsRGBです。シェーダー を参照してください。
アプリケーションを標準カラーワークフローからリニアカラーワークフローに変換する¶
アプリケーションを標準カラーワークフローからリニアカラーワークフローに変換するには、次の手順を実行します。
リニアカラーワークフローを設定して、アプリケーションが sRGB カラースペースを使用するように設定します。
application.cfgで:SurfaceColorSpace = "srgb"
Application::onConfigure関数内のC++アプリケーションで:configuration.defaultSurfaceProperties.colorSpace = "srgb";
SurfaceColorSpace を参照してください。
Kanzi Studio の Project > Properties で、Color Workflow を Linear に設定します。
Library > Materials and Textures > Material Types の各マテリアルタイプにおいて、以下を確認してください。
バインディングには、不要な手動で追加されたsRGB変換が含まれていません。
例えば、色の値を線形カラー空間からsRGBカラー空間に変換するために linearTosRGB バインディング関数を使用する必要はありません。線形カラーのワークフローでは、シェーダーは色の入力が線形カラー空間であることを期待します。
シェーダーは、入力または出力でガンマ補正を適用しません。
リニアカラーのワークフローでは、シェーダーはカラー入力がリニアカラースペースであることを期待し、リニアカラースペースでカラーを出力します。
Library > Resource Files > Images で、ASTC、ETC2、JPEG、または PNG フォーマットを使用する各画像リソースの sRGB Content プロパティが正しく設定されていることを確認します。
画像にsRGBカラ情報が含まれている場合、sRGB Content プロパティを有効に設定します。これはデフォルトの設定です。
sRGBカラー情報を含む画像の sRGB Content プロパティを無効にすると、Kanzi がその画像を使用するテクスチャを予想以上に明るくレンダリングすることがあります。
画像に法線、粗さ、またはオクルージョンマップなどの非カラー情報が含まれている場合は、sRGB Content プロパティを無効に設定してください。
非色情報を含むテクスチャはリニアフォーマットで保存されます。sRGB Content プロパティを無効にすることで、Kanzi を設定し、カラースペース変換を行わずにイメージデータをシェーダーに直接渡します。
目的の色のブレンド結果を得るために、必要に応じてプロジェクト内の部分的に透明な色を調整してください。
たとえば、次のカラーブラシで塗りつぶしたノードは、標準カラーワークフローモードとリニアカラーワークフローモードとで見た目が異なります。
Standard カラーワークフロー
Linear カラーワークフロー