Opengl es sobel filter Opengl ES中不必要的网格线

Opengl es sobel filter Opengl ES中不必要的网格线,opengl-es,glsl,opengl-es-2.0,raspberry-pi,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)*

我的目标是在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));
}
这是调试映像。

发布图像。
这只是部分答案。我确实注意到你的着色器中有一个错误的符号:

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

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

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

据p。4.5.3必须明确指定片段着色器的浮点精度-某些OpenGL ES驱动程序甚至可能无法编译没有浮点精度的片段着色器

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

precision highp float;

只有在使用-Ox标志编译时,才会出现问题。x=1,2,3 CPU代码的编译方式不应该真正影响着色器中发生的事情。如果只在着色器中对纹理进行采样,而不进行任何过滤计算,那么纹理是否正常?是的,纹理在没有任何过滤器的情况下看起来正常。如果我输出“tp10”输出很好,如果我输出“tm10”输出很好,但是当我执行“tp10-tm10”时,我会得到线条。添加“precision highp float;”没什么区别,我对所有的着色器都做了。