Libgdx 片段着色器绘制意外的边界线
我有一个着色器程序,它将使边界线取决于每个像素周围的alpha值。我希望沿图像添加一条黄色边界线,如下所示: 然而,它并没有给我预期的答案。我最不能理解的是,为什么在图像的边界一侧总是有一条边界线 我的片段着色器代码:Libgdx 片段着色器绘制意外的边界线,libgdx,shader,fragment-shader,Libgdx,Shader,Fragment Shader,我有一个着色器程序,它将使边界线取决于每个像素周围的alpha值。我希望沿图像添加一条黄色边界线,如下所示: 然而,它并没有给我预期的答案。我最不能理解的是,为什么在图像的边界一侧总是有一条边界线 我的片段着色器代码: varying vec4 v_color; varying vec2 v_texCoords; uniform sampler2D u_texture; uniform vec2 u_imageSize; uniform vec4 u_borderColor; un
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.0>1.0引起的。因此,纹理被查找为“出界”。这种情况下发生的情况取决于包裹参数(请参阅。在坐标不在[0.0,1.0]范围内时,向循环中添加范围检查并跳过查找),以解决此问题:
for(float dx=-u\u borderSize;dx1.0 | |点y<0.0 | |点y>1.0)
持续
浮点alpha=纹理2d(u_纹理,点)。a;
如果(α<0.5)
isInteriorPoint=false;
如果(α>0.5)
isExteriorPoint=false;
}
}
我不完全理解您想要达到的目的。您能上传一张所需结果的图片吗?@Nadir抱歉信息不完整。我已在问题中添加了所需图像。请查看。感谢您的帮助。我尝试添加范围检查,但在我的情况下没有什么不同:(除此之外,我还添加了一些额外的信息。请看一下。