テクスチャを使用してカラー ルックアップを行って、画像に効果を適用しています。私のルックアップは、最初のテクスチャのフラグメントの輝度を使用してグラデーション マップを作成し、それを 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 に固定されている場合、どのように端を越えてサンプルを引っ張っていますか?
また、テクスチャを作成するときに上記のクランプ呼び出しを使用する必要がありますか、それともテクスチャを使用しようとしているときに呼び出すことができますか?