0

テクスチャを使用してカラー ルックアップを行って、画像に効果を適用しています。私のルックアップは、最初のテクスチャのフラグメントの輝度を使用してグラデーション マップを作成し、それを 2 番目のテクスチャでルックアップします。2 番目のテクスチャは 256x256 で、水平方向にグラデーションがあり、上から下にいくつかの異なるグラデーションがあります。したがって、それぞれの高さが 8 ピクセルの 32 個の横縞です。x でのルックアップは輝度であり、y ではグラデーションであり、クロスオーバーを避けるためにストライプの中心をターゲットにしています。

私のフラグメントシェーダーは次のようになります。

 lowp vec4 source = texture2D(u_textureSampler, v_fragmentTexCoord0);
 float luminance = 1.0 - dot(source.rgb, W);
 lowp vec2 texPos;
 texPos.x = clamp(luminance, 0.0, 1.0);
 // the y value selects which gradient to use by supplying a T value
 // this would be more efficient in the vertex shader
 texPos.y = clamp(u_value4, 0.0, 1.0);

 lowp vec4 newColor1 = texture2D(u_textureSampler2, texPos);

うまく機能しますが、白の最も白い部分と黒の最も黒い部分に歪みが生じていました。基本的に、texture2 のまったく別の場所から newColor を取得したか、それらのフラグメントに対して何も取得していないように見えました。シェーダーにクランプを追加して、ルックアップ テクスチャの端からはみ出さないようにしましたが、効果はありませんでした。クランプを正しく使用していませんか?

最後に、ソース テクスチャまたはロード方法に関係があるのではないかと考えました。私は追加することでそれを修正しました:

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

なぜ?

ルックアップ テーブルをロードするときにコードに例外を記述しなければならないため、テクスチャをクランプする必要があるのは少し面倒です。

私の textPos.x と .y が 0-1 に固定されている場合、どのように端を越えてサンプルを引っ張っていますか?

また、テクスチャを作成するときに上記のクランプ呼び出しを使用する必要がありますか、それともテクスチャを使用しようとしているときに呼び出すことができますか?

4

1 に答える 1

4

これはテクスチャ サンプラーの正しい動作です。

これを説明しましょう。サンプリング GPUでテクスチャを使用するGL_LINEARと、近くのピクセルとブレンドされたピクセルの平均色が取得されます (モードのようにピクセル化が表示されない理由は、GL_NEAREST代わりにピクセルがぼやけているためです)。モードでは、GL_REPEATテクスチャ座標は 0 から 1 にラップされ、その逆も同様で、近くのピクセルとブレンドされます (つまり、極端な座標では、テクスチャの反対側とブレンドされます)。GL_CLAMP_TO_EDGEこのラッピング動作を防ぎ、ピクセルはテクスチャの反対側からのピクセルとブレンドしません。

私の説明が明確であることを願っています。

于 2013-09-23T12:39:42.930 に答える