我的目标是在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));
}
这是调试图像。
发布图片。
答案 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;