Opengl es 如何在偏移原始vec4后替换纹理2D的空像素?

Opengl es 如何在偏移原始vec4后替换纹理2D的空像素?,opengl-es,glsl,textures,opengl-es-2.0,fragment-shader,Opengl Es,Glsl,Textures,Opengl Es 2.0,Fragment Shader,基本上,我用这段代码将texture2D从其原始的inputImageTexture中偏移 highp vec2 toprightcoord = textureCoordinate + 0.25; highp vec4 tr = texture2D(inputImageTexture, toprightcoord); 它做了它应该做的,但是它从偏移纹理的边缘留下了一个拉伸的像素颜色(就像从拉过的比萨饼片中取出的奶酪)。 如何将其替换为任何颜色或透明?我假设您已将纹理包裹参数设置为GL\u CL

基本上,我用这段代码将texture2D从其原始的inputImageTexture中偏移

highp vec2 toprightcoord = textureCoordinate + 0.25;
highp vec4 tr = texture2D(inputImageTexture, toprightcoord);
它做了它应该做的,但是它从偏移纹理的边缘留下了一个拉伸的像素颜色(就像从拉过的比萨饼片中取出的奶酪)。
如何将其替换为任何颜色或透明?

我假设您已将纹理包裹参数设置为
GL\u CLAMP\u to\u EDGE
。看见 这会导致在使用纹理查找功能访问纹理时拉伸像素,超出范围[0.0,1.0]

可以使用包裹参数
GL\u REPEAT
创建“平铺”纹理

但是如果你想

“如何将其替换为任何颜色或透明?”

,然后您必须进行范围检查

如果在
x
y
坐标处超过1.0的限制,则以下代码将alpha通道设置为0.0。其中,如果纹理坐标在边界内,则变量
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函数

如果
x[i]
,则返回0.0,否则返回1.0

使用glsl功能,颜色可以替换为不同的颜色:

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

真棒,这是可行的,虽然透明部分仍然留下一些混合颜色,但它仍然做它应该做的。谢谢你,伙计
vec4 red = vec4(1.0, 0.0, 0.0, 1.0); 
tr = mix(red, tr, inBounds);