2014-10-19 34 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