我有一个着色器程序,它将使边界线取决于围绕每个像素的alpha值。我希望像这样在图像上添加黄色边框:
但是,它没有给我期望的答案。我最不明白的是,为什么在图像的一个边界侧总会有一条边界线。
我的片段着色器代码:
varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform vec2 u_imageSize;
uniform vec4 u_borderColor;
uniform float u_borderSize;
void main() {
vec4 color = texture2D(u_texture, v_texCoords);
vec2 pixelToTextureCoords = 1. / u_imageSize;
bool isInteriorPoint = true;
bool isExteriorPoint = true;
for (float dx = -u_borderSize; dx < u_borderSize; dx++)
{
for (float dy = -u_borderSize; dy < u_borderSize; dy++){
vec2 point = v_texCoords + vec2(dx,dy) * pixelToTextureCoords;
float alpha = texture2D(u_texture, point).a;
if ( alpha < 0.5 )
isInteriorPoint = false;
if ( alpha > 0.5 )
isExteriorPoint = false;
}
}
if (!isInteriorPoint && !isExteriorPoint && color.a < 0.5)
gl_FragColor = u_borderColor;
else
gl_FragColor = v_color * color;
}
我的顶点着色器代码:
attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
varying vec4 v_color;
varying vec2 v_texCoords;
uniform mat4 u_projTrans;
uniform vec2 u_viewportInverse;
void main() {
v_color = a_color;
v_texCoords = a_texCoord0;
gl_Position = u_projTrans * a_position;
}
我的定义代码:
shaderProgram.setUniformf( "u_imageSize", new Vector2(getWidth(), getHeight()) );
shaderProgram.setUniformf( "u_borderColor", Color.YELLOW );
shaderProgram.setUniformf( "u_borderSize", 1 );
结果图像(上面的形状没有着色器,下面的形状具有着色器):
请提供给我任何类型的指南。
答案 0 :(得分:1)
引起该问题的原因是,循环中的纹理坐标分别变为 <0.0 > 1.0 。因此,“超出范围”查找纹理。在这种情况下会发生什么情况取决于换行参数(请参见glTexParameter
。将坐标添加到循环中,并在坐标不在[0.0,1.0]范围内时跳过查找,以解决此问题:
userId