Если вы хотите пропустить некоторые части текстуры, вы можете использовать ключевое слово discard
. Эта команда приводит к тому, что выходные значения фрагмента отбрасываются, а фрагменты не отображаются вообще.
Если у вас прямоугольная область и вы хотите рисовать только во 2-й половине прямоугольной области, то вы должны отбросить фрагменты в 1-й половине:
if (vTexCoordIn.x < 0.5)
discard;
Если вы хотите нарисовать диапазон от rightsliderStartval
до rightsliderEndval
во 2-й половине прямоугольной области, то вам необходимо отобразить координату входящей текстуры ранга [0.5, 1.0] vTexCoordIn.x
на [rightsliderStartval, rightsliderEndval] ]:
float w = (vTexCoordIn.x-0.5) * 2.0; // [0.5, 1.0] -> [0.0, 1.0]
float u = mix(rightsliderStartval, rightsliderEndval, w); // [0.0, 1.0] -> [0.7, 0.9]
Это приводит к фрагменту шейдера:
precision highp float;
uniform sampler2D sTexture;
varying vec2 vTexCoordIn;
void main ()
{
float rightsliderStartval = 0.7;
float rightsliderEndval = 0.9;
if (vTexCoordIn.x < 0.5)
discard;
float u = mix(rightsliderStartval, rightsliderEndval, (vTexCoordIn.x-0.5) * 2.0);
vec4 color = texture2D(sTexture, vec2(u, vTexCoordIn.y));
gl_FragColor = color;
}
Если вы не хотите, чтобы изображение растягивалось, у вас есть 2 варианта.
Либо откажитесь от региона от 0,0 до 0,7 и от 0,9 до 1,0:
precision highp float;
uniform sampler2D sTexture;
varying vec2 vTexCoordIn;
void main ()
{
float rightsliderStartval = 0.7;
float rightsliderEndval = 0.9;
if (vTexCoordIn.x < 0.7 || vTexCoordIn.x > 0.9)
discard;
vec4 color = texture2D(sTexture, vTexCoordIn.xy));
gl_FragColor = color;
}
Или масштабируйте изображение в направлении y:
precision highp float;
uniform sampler2D sTexture;
varying vec2 vTexCoordIn;
void main ()
{
float rightsliderStartval = 0.7;
float rightsliderEndval = 0.9;
if (vTexCoordIn.x < 0.5)
discard;
float u = mix(rightsliderStartval, rightsliderEndval, (vTexCoordIn.x-0.5) * 2.0);
float v_scale = (rightsliderEndval - rightsliderStartval) / 0.5;
float v = vTexCoordIn.y * v_scale + (1.0 - v_scale) / 2.0;;
vec4 color = texture2D(sTexture, vec2(u, v));
gl_FragColor = color;
}