OpenGLを孊びたす。 レッスン5.2-ガンマ補正

OGL3

ガンマ補正


そこで、シヌン内のすべおのピクセルの色を蚈算したした。今床はそれらをモニタヌに衚瀺したす。 デゞタル画像凊理の倜明けには、ほずんどのモニタヌにブラりン管CRTが搭茉されおいたした。 このタむプのモニタヌには物理的な機胜がありたした。入力電圧を2倍に増やしおも、茝床が2倍になるわけではありたせん。 入力電圧ず茝床の関係は、モニタヌガンマずも呌ばれる玄2.2の倀を持぀べき関数で衚されたした。



内容

パヌト1.はじめに


  1. Opengl
  2. りィンドり䜜成
  3. こんにちはりィンドり
  4. こんにちはトラむアングル
  5. シェヌダヌ
  6. テクスチャヌ
  7. 倉換
  8. 座暙系
  9. カメラ

パヌト2.基本的な照明


  1. 色
  2. 照明の基本
  3. 玠材
  4. テクスチャマップ
  5. 光源
  6. 耇数の光源

パヌト3. 3Dモデルをダりンロヌドする


  1. Assimpラむブラリ
  2. メッシュポリゎンクラス
  3. 3Dモデルクラス

パヌト4.高床なOpenGL機胜


  1. 深床テスト
  2. ステンシルテスト
  3. 色混合
  4. 顔のクリッピング
  5. フレヌムバッファ
  6. キュヌビックカヌド
  7. 高床なデヌタ凊理
  8. 高床なGLSL
  9. 幟䜕孊シェヌダヌ
  10. むンスタンス化
  11. スムヌゞング

パヌト5.高床な照明


  1. 高床な照明。 Blinn-Fongモデル。
  2. ガンマ補正
  3. シャドりカヌド
  4. 党方向シャドりマップ
  5. 法線マッピング
  6. 芖差マッピング
  7. HDR
  8. ブルヌム
  9. 遅延レンダリング
  10. SSAO

パヌト6. PBR


  1. 理論
  2. 分析光源
  3. IBL 拡散照射。
  4. IBL ミラヌ露光。


モニタヌのこの機胜偶然によるは、人々が明るさを知芚する方法に非垞に䌌おいたす同様のしかし逆の電力䟝存性を持ちたす。 これをよりよく理解するには、次の画像をご芧ください。



䞀番䞊の行は、人間の目で明るさがどのように知芚されるかを瀺しおいたす。明るさが2倍たずえば、0.1から0.2に増加するず、画像は実際に2倍の明るさのように芋えたす。 ただし、たずえば、光源から出る光子の数など、光の物理的な明るさに぀いお話すずき、䜎いスケヌルは正しい画像を提䟛したす。 その䞊、倀を2倍にするず物理的な芳点から正しい明るさが埗られたすが、私たちの目は暗い色の倉化の圱響を受けやすいため、これは少し奇劙に思えたす。


䞊のバヌゞョンは人間の目に銎染みがあるため、モニタヌは色を衚瀺するずきにべき乗則䟝存性を䜿甚したす。そのため、物理的な意味での元の茝床倀は、䞊のスケヌルに瀺されおいる非線圢の茝床倀に倉換されたす。 これは䞻に芋栄えが良いために行われたす。


モニタヌのこの機胜は実際に私たちの目に画像をより良くしたすが、グラフィックスのレンダリングに関しおは、1぀の問題がありたす。アプリケヌションで蚭定するすべおの色ず明るさの蚭定は、モニタヌの衚瀺に基づいおいたす。 そしお、これは、これらすべおのパラメヌタヌが実際に非線圢であるこずを意味したす。 チャヌトを芋おください



灰色の線は、線圢空間の色の倀に察応しおいたす。 赀い実線は、モニタヌに衚瀺される色空間を衚しおいたす。 線圢空間で2倍明るい色を取埗したい堎合は、その倀を取埗しお2倍にしたす。 たずえば、色ベクトルを取る  vecL=0.5,0.0,0.0.0、぀たり、濃い赀色。 線圢空間で倀を2倍にするず、等しくなりたす 1.0,0.0,0.0。 䞀方、衚瀺されるず、モニタヌの色空間に倉換されたす 0.218、0.0、0.0グラフからわかるように。 ここで問題が発生したす。線圢空間で濃い赀色光を2倍にするこずで、実際にモニタヌで4.5倍以䞊明るくしたす


このチュヌトリアルの前に、線圢空間で䜜業するこずを想定しおいたしたが、実際にはモニタヌで定矩された色空間で䜜業したため、蚭定したすべおの色ず照明倉数は物理的に正しくなく、モニタヌ䞊で特に正しく芋えたした。 この仮定に基づいお、私たちおよびアヌティストは通垞、照明倀を本来よりも明るく蚭定したすモニタヌがそれらを䞍明瞭にするため。その結果、線圢空間での埌続の蚈算のほずんどが䞍正確になりたす。 たた、䞡方のグラフの開始点ず終了点は同じポむントであり、ディスプレむでは䞭間色のみが暗く衚瀺されるこずに泚意しおください。


すでに述べたように、色倀はモニタヌに衚瀺される画像に基づいお遞択されるため、線圢空間で実行されるすべおの䞭間照明蚈算は物理的に正しくありたせん。 これは、より高床な照明アルゎリズムを䜿甚し始めるず、より明確になりたす。 画像を芋おください



ご芧のずおり、ガンマ補正を䜿甚しお以前に曎新した色の倀を互いに組み合わせるず、暗い領域が明るくなり、詳现が向䞊したす。 非垞に小さな倉曎を加えるだけで、はるかに優れた画像品質が埗られたす。


適切に調敎されたモニタヌの色域がないず、照明は正しく芋えず、アヌティストが珟実的で矎しい結果を埗るのは非垞に困難です。 この問題を解決するには、 ガンマ補正を適甚する必芁がありたす。


ガンマ補正


ガンマ補正の背埌にある考え方は、モニタヌに衚瀺する前に、モニタヌのガンマの逆を最終色に適甚するこずです。 繰り返したすが、このレッスンの最初にあるガンマ曲線のグラフを芋お、ストロヌクで瀺される別の線に泚意しおください。これは、モニタヌのガンマ曲線の逆です。 線圢空間に衚瀺される色の倀にこの逆ガンマ曲線を掛けお明るくしたす、モニタヌに衚瀺されるずすぐに、モニタヌのガンマ曲線が適甚され、結果の色が再び線圢になりたす。 実際、䞭間色をより明るくしお、モニタヌのシェヌディングのバランスを取りたす。


もう1぀の䟋を瀺したす。 再び濃い赀色になったずしたしょう 0.5,0.0,0,0.0。 この色をモニタヌに衚瀺する前に、たずガンマ補正曲線をそのコンポヌネントに適甚したす。 線圢空間の色の倀は、モニタヌに衚瀺されるずきに玄2.2の环乗になるため、反転するには倀を1/2の环乗に䞊げる必芁がありたす。 したがっお、ガンマ補正を䜿甚した暗赀色は、 0.5,0.0,0,0.01/2.2= 0.5,0.0,0,0.00.45= 0.73,0.0,0.0。 この修正された色はモニタヌに衚瀺され、その結果、次のように衚瀺されたす 0.73,0.0,0.02.2= 0.5,0.0,0,0.0。 ご芧のずおり、ガンマ補正を䜿甚するず、アプリケヌションの線圢空間で蚭定したずおりにモニタヌに色が衚瀺されたす。


2.2のガンマはデフォルト倀で、ほずんどのディスプレむの平均ガンマを倧たかに衚したす。 この色域から生じる色空間は、sRGB色空間ず呌ばれたす。 各モニタヌには独自のガンマ曲線がありたすが、ほずんどのモニタヌでは2.2の倀で良奜な結果が埗られたす。 これらの小さな違いのため、倚くのゲヌムではプレむダヌがガンマ蚭定を倉曎できたす。

シヌンにガンマ補正を適甚するには、2぀の方法がありたす。



最初のオプションはよりシンプルですが、制埡が少なくなりたす。 GL_FRAMEBUFFER_SRGBフラグを蚭定するず、次のすべおの描画コマンドがsRGBカラヌスペヌスでガンマ補正を実行しおからデヌタをカラヌバッファヌに曞き蟌む必芁があるこずをOpenGLに䌝えたす。 GL_FRAMEBUFFER_SRGBを有効にするず、デフォルトのフレヌムバッファヌを含む埌続のすべおのフレヌムバッファヌに察しお各フラグメントシェヌダヌが起動された埌、 OpenGLは自動的にガンマ補正を実行したす。


GL_FRAMEBUFFER_SRGBフラグを有効にするには 、通垞のglEnable呌び出しを䜿甚したす。


glEnable(GL_FRAMEBUFFER_SRGB); 

これで、レンダリングされたカラヌバッファの色域が調敎されたす。これはハヌドりェアで行われるため、コストはかかりたせん。 このアプロヌチで芚えおおくべき唯䞀のこずは別のアプロヌチでも、ガンマ補正は色を線圢空間から非線圢に倉換するこずです。したがっお、最埌の最終段階でのみガンマ補正を実行するこずが非垞に重芁です。 最終出力の前にガンマ補正を適甚するず、これらの色に察する以降のすべおの操䜜は正しくない倀で機胜したす。 たずえば、耇数のフレヌムバッファヌを䜿甚する堎合、䞭間結果を線圢空間に残し、モニタヌに送信する前に最埌のバッファヌのみがガンマ補正を適甚する必芁がありたす。


2番目のアプロヌチではもう少し䜜業が必芁ですが、ガンマ操䜜を完党に制埡できたす。 フラグメントシェヌダヌの察応する段階でガンマ補正を適甚するため、モニタヌに送信する盎前に結果の色にガンマ補正が適甚されたす。


 void main() { //     [...] //  - float gamma = 2.2; FragColor.rgb = pow(fragColor.rgb, vec3(1.0/gamma)); } 

コヌドの最埌の行は、各fragColorカラヌコンポヌネントを环乗したす。 1.0/ガンマ、このシェヌダヌの結果を調敎したす。


このアプロヌチの問題は、最終出力に寄䞎する各フラグメントシェヌダヌにガンマ補正を適甚する必芁があるため、耇数のオブゞェクトに1ダヌスのフラグメントシェヌダヌがある堎合、それぞれにガンマ補正コヌドを远加する必芁があるこずです。それら。 より合理的な解決策は、レンダリングサむクルに埌凊理ステップを远加し、最埌のステップずしお最埌のクワッドにガンマ補正を適甚するこずです。 その埌、これを䞀床だけ行う必芁がありたす。


実際、これらの2行のコヌドは、ガンマ補正の技術的な実装を衚しおいたす。 あたり印象的ではありたせんか ちょっず埅っお、ガンマ補正の際に考慮すべき埮劙な違いがいく぀かありたす。


sRGBテクスチャ


コンピュヌタヌで画像を描画たたは線集するずきは垞に、モニタヌに衚瀺されるものに基づいお色を遞択したす。 実際、これは、䜜成たたは線集したすべおの画像が線圢空間ではないこずを意味したすが、sRGB空間では、぀たり、知芚する明るさに基づいお画面の濃い赀色を2倍にするこずは、実際には色の赀色成分を2倍にするこずずは異なりたす。


その結果、テクスチャアヌティストはsRGB空間でそれらを䜜成し、アプリケヌションでこれらのテクスチャをそのたた䜿甚する堎合、これを考慮する必芁がありたす。 ガンマ補正を適甚する前は、テクスチャはsRGB空間で芋栄えがよく、ガンマ補正なしではこの空間でも䜜業を行っおいたため、問題は発生したせんでした。 ただし、すべおを線圢空間で衚瀺しおいるため、次の画像に瀺すように、テクスチャの色が正しく衚瀺されたせん。



テクスチャが露出オヌバヌになっおいるのは、実際にはガンマ補正が2回適甚されたためです 自分で刀断するモニタヌで芋たものに基づいお画像を䜜成するずき、画像の色の倀の範囲を調敎しお、画面䞊で正しく芋えるようにしたす。 レンダリング時に再びガンマ補正を行うため、画像が明るすぎたす。


この問題を解決するには、テクスチャアヌティストが線圢空間で動䜜するこずを確認する必芁がありたす。 ただし、ほずんどのアヌティストはガンマ補正ずは䜕なのかさえ知らず、sRGBスペヌスで䜜業する方が簡単なので、これはほずんどの堎合オプションではありたせん。


別の解決策は、色の操䜜を行う前に、これらのsRGBテクスチャを線圢空間に調敎たたは倉換しお戻すこずです。 これは次のように実行できたす。


 float gamma = 2.2; vec3 diffuseColor = pow(texture(diffuse, texCoords).rgb, vec3(gamma)); 

ただし、sRGB空間のすべおのテクスチャに察しおこれを行うのは非垞に面倒です。 幞いなこずに、OpenGLは内郚テクスチャ圢匏GL_SRGBおよびGL_SRGB_ALPHAを提䟛するこずにより、問題に察する別の解決策を提䟛したす。


指定された2぀のsRGBテクスチャ圢匏のいずれかを䜿甚しおOpenGLでテクスチャを䜜成するず、OpenGLは䜿甚するずすぐに自動的に色を線圢空間に倉換したす。 次のように、テクスチャをsRGBずしお宣蚀できたす。


 glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 

テクスチャでアルファコンポヌネントを䜿甚する堎合は、内郚テクスチャ圢匏をGL_SRGB_ALPHAずしお指定する必芁がありたす。


すべおのテクスチャがsRGB空間にあるわけではないため、テクスチャをsRGBずしお宣蚀するずきは泚意が必芁です。 拡散マップなどのオブゞェクトの色付けに䜿甚されるテクスチャは、ほずんどの堎合sRGB空間にありたす。 逆に、 グレアや法線マップなどの照明パラメヌタヌを抜出するために䜿甚されるテクスチャは、ほずんど垞に線圢空間にあるため、sRGBずしお宣蚀するず、照明が適甚されたす。 テクスチャタむプを指定するずきは泚意しおください。


拡散テクスチャをsRGBずしお宣蚀するず、期埅どおりの結果が埗られたすが、今回はガンマ補正を1回だけ適甚すれば十分です。


枛衰


ガンマ補正を䜿甚する堎合に異なるもう1぀のポむントは、照明の調光です。 実際の物理的な䞖界では、照明は光源からの距離の2乗ずほが逆にフェヌドアりトしたす。 人間の蚀語では、これは、以䞋に瀺すように、光源からの距離ずずもに光匷床が枛少するこずを意味したす。


 float attenuation = 1.0 / (distance * distance); 

ただし、この方皋匏を䜿甚するず、枛衰効果が匷すぎお、光スポットの半埄が小さくなり、物理的に信頌できるようには芋えたせん。 そのため、枛衰に他の方皋匏を䜿甚し 照明の基本に関するチュヌトリアルでこれを説明したした、より倚くのチュヌニングオプション、たたは線圢バヌゞョンを提䟛したす。


 float attenuation = 1.0 / distance; 

ガンマ補正なしでは、線圢バヌゞョンは2次のものよりもはるかに劥圓な結果を提䟛したすが、ガンマ補正をオンにするず、線圢枛衰が匱すぎるように芋え、2次を物理的に修正するず予想倖により良い結果が埗られたす。 次の図は、オプションの違いを瀺しおいたす。



この違いの理由は、光の枛衰機胜が明るさを倉えるためであり、線圢空間でシヌンを衚瀺しなかったため、物理的には正しくありたせんが、モニタヌで最もよく芋える枛衰機胜を遞択したした。 ガンマ補正なしで2次枛衰関数を䜿甚するず、実際には、 1.0/距離22.2モニタヌに衚瀺するず、はるかに倧きなフェヌド効果が埗られたす。 これはたた、線圢バヌゞョンがガンマ補正なしでより良い結果を䞎える理由も説明したす。 1.0/距離2.2= 1.0/距離2.2、これは物理的に正しい関係のようです。


照明の基本で説明したより高床な枛衰関数は、枛衰のより正確な実装のためのより倚くの制埡を提䟛するため、ガンマ補正シヌンで䟝然ずしお有甚ですもちろん、ガンマ補正を䜿甚する堎合は他のパラメヌタヌが必芁です。

簡単なデモシヌンを䜜成したした 。゜ヌスコヌドはここにありたす 。 スペヌスバヌを抌すこずで、ガンマ補正のあるシヌンずないシヌンを切り替えるこずができたす。それぞれのシヌンは独自のテクスチャず枛衰機胜を䜿甚したす。 これは最も印象的なデモンストレヌションではありたせんが、これらの手法を適甚する方法を瀺しおいたす。


芁玄するず、ガンマ補正を䜿甚するず、線圢空間で色を操䜜できたす。 線圢空間は物理的な䞖界に固有のものであるため、ほずんどの物理的な蚈算では、光の枛衰の蚈算など、より良い結果が埗られたす。 ガンマ補正を䜿甚するず、適甚される照明技術がより耇雑になるため、珟実的な結果を埗るこずがはるかに簡単になりたす。 そのため、ガンマ蚭定で動䜜するように照明蚭定をすぐに調敎するこずをお勧めしたす。


远加資料




オリゞナル蚘事



Source: https://habr.com/ru/post/J353632/


All Articles