Почему координата текстуры 1,0 выходит за границы текстуры?
Я делаю поиск цветов, используя текстуру, чтобы применить эффект к изображению. Мой поиск - это карта градиента, использующая яркость фрагмента первой текстуры, а затем ее поиск на второй текстуре. 2-я текстура 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);
Это работает хорошо, но я получал искажения в самых белых частях белых и самой черной части черных. По сути, это выглядело так, как будто он захватил этот newColor из совершенно другого места на texture2, или, возможно, просто ничего не получил за эти фрагменты. Я добавил зажимы в шейдер, чтобы он не выходил за границы текстуры поиска, но это не помогло. Я правильно не использую зажим?
Наконец, я подумал, что это может быть связано с моей исходной текстурой или тем, как она загружена. В итоге я исправил это, добавив:
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.. как он тянет образец за край?
Также... нужно ли использовать вышеупомянутый вызов зажима при создании текстуры, или я могу вызвать его, когда собираюсь использовать текстуру?
1 ответ
Это правильное поведение сэмплера текстуры.
Позвольте мне объяснить это. Когда вы используете текстуры с GL_LINEAR
GPU сэмплирования будет принимать средний цвет пикселя, смешанного с соседними пикселями (поэтому вы не видите пикселизацию как с GL_NEAREST
режим - вместо этого пиксели размыты). И с GL_REPEAT
Координаты текстур в режиме будут перенесены с 0 на 1 и наоборот, смешиваясь с соседними пикселями (т.е. в крайних координатах это будет смешиваться с противоположной стороной текстуры). GL_CLAMP_TO_EDGE
предотвращает такое поведение обтекания, и пиксели не будут смешиваться с пикселями с противоположной стороны текстуры.
Надеюсь, мое объяснение понятно.