2014-10-19 67 views
0

我的目标是在Opengl ES中创建sobel过滤器。我正在使用Netbeans IDE。在调试模式下一切正常,但在发布模式下,我正在获取网格线。代码运行在树莓派上。sobel过滤器中的不必要的网格线Opengl ES

任何人都可以帮我摆脱这些线?

这是片段着色器代码。

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

回答

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); 

虽然我不相信这会解释网格线。但它肯定会提高结果的质量。

+0

谢谢,但它并没有解决这个问题:

你可以用这个指令在着色器的最开始设定的精度。 – 2014-10-20 04:52:57

+0

只有在使用-Ox标志进行编译时才会出现问题。 x = 1,2,3 – 2014-10-20 05:48:45

+0

如何编译CPU代码不应该影响着色器中发生的情况。如果仅仅在着色器中进行采样,没有任何过滤计算,纹理是否正常? – 2014-10-20 05:56:59

0

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

根据p。 4.5.3 of GLSL ES tech specs您必须明确指定片段着色器的浮点精度 - 某些OpenGL ES驱动程序甚至可能无法编译片段着色器,而无法使用浮点精度。指出这一点

precision highp float; 
+0

添加'precision highp float;'没有任何区别。我对所有的着色器都做了。 – 2014-10-20 09:27:56