索贝尔滤波器Opengl ES中不必要的网格线

时间:2014-10-19 08:58:48

标签: opengl-es glsl opengl-es-2.0 raspberry-pi

我的目标是在Opengl ES中创建sobel过滤器。我正在使用Netbeans IDE。在调试模式下一切正常,但在发布模式下,我得到了网格线。代码在raspberry pi上运行。

任何人都可以帮我摆脱这些界限吗?

这是片段着色器代码。

varying vec2 tcoord;
uniform sampler2D tex;
uniform vec2 texelsize;
void main(void) 
{
    vec4 tm1m1 = texture2D(tex,tcoord+vec2(-1,-1)*texelsize);
    vec4 tm10 = texture2D(tex,tcoord+vec2(-1,0)*texelsize);
    vec4 tm1p1 = texture2D(tex,tcoord+vec2(-1,1)*texelsize);
    vec4 tp1m1 = texture2D(tex,tcoord+vec2(1,-1)*texelsize);
    vec4 tp10 = texture2D(tex,tcoord+vec2(1,0)*texelsize);
    vec4 tp1p1 = texture2D(tex,tcoord+vec2(1,1)*texelsize);
    vec4 t0m1 = texture2D(tex,tcoord+vec2(0,-1)*texelsize);
    vec4 t0p1 = texture2D(tex,tcoord+vec2(0,-1)*texelsize);

    vec4 xdiff = -1.0*tm1m1 + -2.0*tm10 + -1.0*tm1p1 + 1.0*tp1m1 + 2.0*tp10 + 1.0*tp1p1;
    vec4 ydiff = -1.0*tm1m1 + -2.0*t0m1 + -1.0*tp1m1 + 1.0*tm1p1 + 2.0*t0p1 + 1.0*tp1p1;
    vec4 tot = sqrt((xdiff*xdiff)+(ydiff*ydiff));

    vec4 col = tot;
    col.a = 1.0;

    gl_FragColor = clamp(col,vec4(0),vec4(1));
}

这是调试图像。 Debug image

发布图片。 Release image

2 个答案:

答案 0 :(得分:0)

这只是部分答案。我注意到你的着色器中有一个错误的标志:

vec4 t0m1 = texture2D(tex,tcoord+vec2(0,-1)*texelsize);
vec4 t0p1 = texture2D(tex,tcoord+vec2(0,-1)*texelsize);

这两个值相同。遵循其他值的模式,这应该是:

vec4 t0m1 = texture2D(tex,tcoord+vec2(0,-1)*texelsize);
vec4 t0p1 = texture2D(tex,tcoord+vec2(0,1)*texelsize);
但是,我不相信这会解释网格线。但它肯定会提高结果的质量。

答案 1 :(得分:0)

这是片段着色器的完整代码吗?这看起来可能是由于精度不高造成的。

根据p。 4.5 GLSL ES tech specs必须为片段着色器显式指定浮点精度 - 某些OpenGL ES驱动程序甚至无法编译没有浮点精度的片段着色器。

您可以在着色器的最开始处使用此指令设置精度:

precision highp float;