Как заменить свободные пиксели texture2D после смещения от оригинального vec4? - PullRequest
0 голосов
/ 10 мая 2018

В основном я компенсирую texture2D из исходного inputImageTexture с помощью этого кода

highp vec2 toprightcoord = textureCoordinate + 0.25;
highp vec4 tr = texture2D(inputImageTexture, toprightcoord);

Он делает то, что должен, но оставляет растянутый пиксельный цвет от края смещенной текстуры (как сыр из кусочка пиццы). Как заменить его на любой цвет или прозрачный?

1 Ответ

0 голосов
/ 10 мая 2018

Я предполагаю, что вы установили параметры обтекания текстур на GL_CLAMP_TO_EDGE.См. glTexParameter.Это вызывает растяжение пикселей при доступе к текстуре с помощью функции поиска текстуры texture2D, выходящей за пределы диапазона [0.0, 1.0].

Вы можете создать «плиточную» текстуру с параметром обтекания GL_REPEAT.

Но если вы хотите

«Как заменить его на любой цвет или прозрачный?»

, тогда вам нужно выполнить проверку диапазона.

Следующий код устанавливает альфа-канал на 0,0, если предел 1,0 превышен по координате x или y.Где переменная inBounds установлена ​​в 1.0, если координата текстуры в границах, а в противном случае она установлена ​​в 0.0:

vec2 toprightcoord = textureCoordinate + 0.25;
vec4 tr = texture2D(inputImageTexture, toprightcoord);

vec2  boundsTest = step(toprightcoord, vec2(1.0));
flaot inBounds   = boundsTest.x * boundsTest.y;
tr.a *= inBounds;

Вы можете расширить это до теста диапазона в [0.0, 1.0]:

vec2 boundsTest = step(vec2(0.0), toprightcoord) * step(toprightcoord, vec2(1.0)); 

Обратите внимание, функция glsl step

genType step( genType edge, genType x);

возвращает 0.0, если x[i] < edge[i], и 1.0 возвращается в противном случае.

С помощью функции glsl mix цвет можно заменить другим:

vec4 red = vec4(1.0, 0.0, 0.0, 1.0); 
tr = mix(red, tr, inBounds);
...