如何在偏离原始vec4后替换texture2D的空白像素?

时间:2018-05-10 02:36:51

标签: textures opengl-es-2.0 fragment-shader

基本上我用这段代码将texture2D从原来的inputImageTexture中抵消

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

它会做它应该做的事情,但是它会从偏移纹理的边缘留下拉伸的像素颜色(就像拉出披萨片的奶酪一样)。 如何将其替换为任何颜色或透明?

1 个答案:

答案 0 :(得分:1)

我假设您已将纹理包装参数设置为GL_CLAMP_TO_EDGE。见glTexParameter。 当使用纹理查找函数texture2D访问纹理时,这会导致拉伸像素超出范围[0.0,1.0]。

您可以使用wrap参数GL_REPEAT创建“平铺”纹理。

但如果你想要

  

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

,然后你必须做范围检查。

如果在xy坐标处超出限制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函数step

genType step( genType edge, genType x);

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

使用glsl函数mix,颜色可以用不同的颜色替换:

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