Я выполняю поиск цвета, используя текстуру, чтобы применить эффект к изображению. Мой поиск представляет собой карту градиента, использующую яркость фрагмента первой текстуры, а затем ищущую ее на второй текстуре. Вторая текстура имеет размер 256x256 с горизонтальными градиентами и несколькими различными градиентами сверху вниз. Итак, 32 горизонтальные полосы высотой по 8 пикселей каждая. Мой поиск по 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);
Это работает хорошо, но у меня были искажения в самых белых частях белого и в самых черных частях черного. По сути, это выглядело так, как будто он взял этот новый цвет из совершенно другого места на текстуре 2 или, возможно, просто ничего не получил для этих фрагментов. Я добавил зажимы в шейдере, чтобы он не выходил за границы текстуры поиска, но это не помогло. Я неправильно использую зажим?
В конце концов я подумал, что это может иметь какое-то отношение к моей исходной текстуре или способу ее загрузки. В итоге я исправил это, добавив:
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... как он вытягивает образец за край?
Кроме того, нужно ли использовать указанный выше вызов зажима при создании текстуры или я могу вызвать его, когда собираюсь использовать текстуру?