0

画像に対してRGBガンマ調整を実行する単純なGLフラグメントシェーダーを作成しました。

uniform sampler2D tex;
uniform vec3 gamma;

void main()
{
    vec3 texel = texture2D(tex, gl_TexCoord[0].st).rgb;
    texel = pow(texel, gamma);
    gl_FragColor.rgb = texel;
}

テクスチャは画面の大部分をペイントしますが、これはテクスチャの入力ピクセルごとではなく、画面上の出力ピクセルごとに調整を適用していることに気付きました。見た目は変わりませんが、画面に比べると質感が小さいです。

効率を上げるために、シェーダーに画面ピクセルではなくテクスチャピクセルを処理させるにはどうすればよいですか?それが役に立ったら、とにかくすべてのフレームでこのテクスチャのデータを変更/再ロードしているので、テクスチャが永続的に変更されてもかまいません。

4

1 に答える 1

2

そして、これが画面上の出力ピクセルごとの調整を適用していることに気づきました

ほとんど。フラグメントシェーダーは、出力フラグメントごとに実行されます(そのため名前が付けられています)。フラグメントは、ピクセルに書き込まれる前のラスタライズの最小単位です。表示されているレンダリングされたジオメトリの一部で覆われているすべてのピクセルは、1つ以上のフラグメントに変換されます(たとえば、アンチエイリアス処理されたフレームバッファに描画する場合、カバーされているピクセルよりもさらに多くのフラグメントが存在する可能性があります)。

効率のために、

最近のGPUは、わずかに減少した負荷に「気付く」ことさえしません。これは一種のマイクロ最適化であり、測定不能の危機に瀕しています。私のアドバイス:心配しないでください。

シェーダーに画面ピクセルではなくテクスチャピクセルを処理させるにはどうすればよいですか?

最初に、アンチエイリアス処理されていないフレームバッファオブジェクトではなく、テクスチャサイズのテクスチャを介して中間テクスチャにレンダリングすることにより、テクスチャを前処理することができます。ただし、変更が非線形であり、ガンマ調整がまさにそれである場合は、これを行うべきではありません。線形色空間で画像を処理し、非線形変換をできるだけ遅く適用したいとします。

于 2013-02-03T10:55:59.220 に答える