【Unity3D開発の日々】Unity3Dの色空間【徹底解析】

推奨読書

皆さんこんにちは、仏教エンジニア☆静かなる小さな魔法のドラゴン☆です。Unity の開発スキルを随時更新しています。役に立ったと思ったら、忘れずに 3 回クリックしてください。

I.はじめに

Edit→Player Settings→Other Settings→Rendering→Color Space(颜色空间)

雰囲気をつかむために、最初に画像を載せてみましょう。Unity
ここに画像の説明を挿入します
のパッケージ化オプションには、[カラー スペース] オプションがあり、次の2 つのオプションがありますGamma: と。Linear

主な機能は、Unity が入力デフォルト マップを変換するかどうかを設定することですが、この問題はノーマル マップには存在しません。

Gammaの場合、Unityがバックグラウンドで画像を変換することはなく、入力画像が補正画像であってもUnityが処理することはなく、例えば手動で実装しない限りは起こりませRemove Gamma Correction去除伽马校正Gamma Correction伽马校正

LinearUnity が線形空間を統合するプロセス、つまり sRGB テクスチャを実行するとき、Gamma CorrectionUnity は GPU を使用して画像をサンプリングし、剔除矫正Remove Gamma Correctionそれを線形空間に変換し、それを処理のためにシェーダーに渡し、処理された画像を作成します。が追加されGamma矫正、再び画面に表示されます。

つまり、Gamma入力と出力は処理されませんが、LinearsRGB テクスチャは処理されます剔除矫正,转换到线性空间,再传给Shader处理

次に、ガンマとリニアの原理、リニア色空間をサポートするテクスチャ タイプ、リニア空間をサポートするハードウェアと機能を見てみましょう。

2. テキスト

2-1. テクスチャとリニア

Unity は、インポートされたマップのインポート設定パネルでsRGB (カラー テクスチャ)オプションを選択します。これをオンにすると、これがsRGB マップであることが Unity に通知されます。照明計算用のデータを取得するには、 sRGBをエンコードする必要があります。チェックされていない場合は、これは sRGB マップであることを意味し、そのカラー データを照明計算に直接使用できる線形マップです。

もちろん、sRGB (カラー テクスチャ)オプション以外にも、ノーマル マップやライト マップなどのタイプはLinear であり、タイプを設定した後に Unity が処理します。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

では、sRGB マップはいつ使用されるのでしょうか?

たとえば、テクスチャをエクスポートする場合、アルベドや鏡面カラーなどの色情報を提供するテクスチャは sRGB でエンコードされます。これの目的は、テクスチャをより快適に、人間の目の認識方法と一致させることです。

したがって、この場合は、sRBG マップをエクスポートして使用できます。ただし、法線マップや金属性マップなどの数値情報を格納するマップについては、 sRBG エンコードが行われないため、線形マップとして使用されます。

2-2. sRGBとは

上記は解码Gammaあくまで理想的な条件下でのメカニズムです。

ただし、各モニターのデコードされたガンマ値は均一ではないため、同じ画像でもモニターが異なると異なって見えます。

解決策は、RGB 値と色の波長の対応関係であるカラー プロファイルを導入することです。

各画像にはカラー プロファイルがあり、モニターはこのファイルを受信すると、そのファイルを画面に必要な RGB 値に変換し、モニター自身のカラー プロファイルに従って特定の波長を出力します。

言い換えれば、カラー プロファイルには波長値とガンマ補正の両方が含まれます。

sRGB は最も一般的なカラー プロファイルであり、Microsoft と Hewlett-Packard およびその他のメーカーが共同開発したカラー標準です。

sRGB 色空間はガンマ色空間です。

2-3. ハードウェア機能のサポート

主に次の 2 つのハードウェア機能によってサポートされています。

sRGB フレームバッファ

  • Shaderの計算結果をディスプレイに出力する前にガンマ補正を残す
  • テクスチャとして読み取られると、保存されたカラーは sRGB 空間から線形空間に自動的に変換されます。
  • ReadPixels() および readBackImage() を呼び出すと、sRGB 空間の色が直接返されます。
  • sRGB フレーム バッファは、チャネルごとに 8 ビット形式のみをサポートし、浮動小数点形式はサポートしません。
  • HDR をオンにすると、レンダリング結果はまず浮動小数点形式で FB に描画され、最後に sRGB FB に描画されて
    sRGB サンプラーに出力されます。
  • sRGB テクスチャを線形サンプリングに変換する
  • ハードウェア機能を使用して sRGB テクスチャの線形サンプリングとシェーダ計算結果のガンマ補正を完了する方が、シェーダでテクスチャ サンプリングと計算結果を補正するよりも高速です。

2-4. 線形空間 線形空間

現実の世界では、光の強さが 2 倍になれば、明るさも 2 倍になるという直線関係になります。

数学的精度を確保するには、ライティングの計算を線形空間で実行する必要があります。つまり、sRGB 形式の入力値を最初に sRGB デコードする必要があります。テクスチャのインポートには **sRGB (カラー テクスチャ)** オプションがあります。設定パネル。

sRGBを有効にチェックすると、サンプリング中にサンプリングされた値が自動的にsRGB にデコードされます。

さらに、sRGB形式のバッファーがセットアップされ、シェーダーがカラー バッファーに書き込む前に、 GPU が自動的にsRGB エンコードを実行します。

ここでは、 sRGB サンプラーsRGB フレーム バッファーという2 つの基礎となるグラフィック API が使用されます
ここに画像の説明を挿入します

(Unity がガンマ色空間を使用する場合、テクスチャは常に線形にサンプリングされるため、sRGB 設定は効果がありません。)

sRGB (カラー テクスチャ) 設定の意味:これは、非 HDR カラー テクスチャ (アルベド カラーやハイライト カラーなど) を常にチェックする必要があります。テクスチャに特定の意味を持つ情報が保存されており、シェーダで正確な値 (滑らかさ、金属性など) を取得する必要がある場合は、このボックスのチェックを外します。このボックスはデフォルトでチェックされています。

実際にUnityでsRGBのチェックを外すと画像が明るくなりますが、実際は以下のような感じになるのではないかと思います(sRGBのチェックを外した画像はsRGB形式にエンコードされます)

ここに画像の説明を挿入します
sRGB は RGB チャネルに対してのみ有効であり、アルファ チャネルに対しては無効です

アルファ値は、エンコード ガンマとデコード ガンマの計算には関与せず、シェーダーに直接入力され、シェーダーによって読み取られます。

例として、MetallicSmoothness マップを取り上げます。Alpha チャネルに保存されている Smoothness は、本質的に線形です。テクスチャが sRGB でチェックされているかどうかに関係なく、影響を受けません。シェーダは、その値を正しく読み取ることができます。

2-5. ガンマとリニアのメリットとデメリット

線形線形色空間

線形線形色空間は、線形関係を使用して色を処理する、光の伝播を示すことに近いマーキング方法です。

リニア線形色空間では、色の値の変化がより正確かつ自然になり、より現実世界の照明効果が可能になります。

ガンマ ガンマ色空間

ガンマ ガンマ色空間は、人間の目の認識とより一貫性があり、非線形関係を使用して色を処理する方法です。

ガンマ色空間では、色の値の変化が人間の目の知覚特性により一致し、コントラストや明るさなどの側面をより適切に表現できます。

結論は

より現実的な照明効果が必要なプロジェクトの場合は、リニア線形色空間を使用する方が適切です。デフォルトの色空間はガンマ色空間です。

人間の目が作成に参加する必要があるすべてのテクスチャは sRGB である必要があります (アートで描かれた絵など)。

コンピューターによって計算されたすべてのテクスチャ (ノイズ、マスク、ライトマップなど) はリニアである必要があります。

これは簡単に説明すると、人間の目で見る場合にのみ、表示特性や補正の問題を考慮する必要があります。

コンピュータにとっては必要ありませんが、コンピュータから見れば単なるデータですので、当然、そのまま Linear を選択するのが最善です。

3. 追記

この記事が役に立ったと思われる場合は、忘れずに「フォロー」をクリックして、Unity に関するさらに役立つ記事を共有し続けてください。


あなたの「いいね!」はブロガーへのサポートとなります。ご質問がございましたら、メッセージを残してください:

ブロガーのホームページに連絡先情報が記載されています。

ブロガーには、あなたが発見できるのを待っているお宝記事もたくさんあります。

カラム 方向 導入
Unity3D は小さなゲームを開発します ミニゲーム開発チュートリアル Unity3D エンジンを使用して開発されたいくつかの小さなゲームを共有し、小さなゲームの作成に関するいくつかのチュートリアルを共有します。
Unity3D の入門から上級まで はじめる Unityを独学することでインスピレーションを得て、Unityをゼロから学習するルートをまとめ、C#とUnityの知識を身につけます。
Unity3D UGUI ウグイ Unity の UI システム UGUI を徹底的に分析し、UGUI の基本的な制御から始めて、UGUI の原理と使い方を包括的に説明します。
Unity3D でのデータの読み取り ファイルの読み取り Unity3D を使用して、txt ドキュメント、json ドキュメント、xml ドキュメント、csv ドキュメント、および Excel ドキュメントを読み取ります。
Unity3Dデータ収集 データ収集 配列コレクション: 配列、リスト、辞書、スタック、リンク リストなどのデータ コレクションに関する知識の共有。
Unity3D VR/AR(仮想シミュレーション)開発 バーチャルリアリティ ブロガーの一般的な仮想シミュレーションのニーズをまとめ、事例を交えて説明します。
Unity3D プラグイン プラグイン 主にUnity開発で使用するプラグインの活用法やプラグインの紹介などをシェアします。
Unity3Dの日々の開発 日々の記録 主にブロガーが日々の開発で使用する手法やテクニック、開発アイデア、コード共有など。
Unity3D の毎日のバグ 日々の記録 Unity3D エディターを使用してプロジェクト開発中に遭遇したバグや落とし穴を記録し、将来の世代が参照できるようにします。

おすすめ

転載: blog.csdn.net/q764424567/article/details/133927994