2014-12-07 117 views
0

我正在为android做一个动态壁纸,我会解释它是如何工作的,因为我相信它与问题有关,对于长问题我很抱歉,但我需要解释一切,因为这个问题很难描述。OpenGLES混合bug,alpha积累

我使用OpenGLES 2.0,我有一个GLSurfaceView和一个壁纸服务实现,我把它传递给我的渲染器来调用绘图方法,就像大多数OpenGL动态壁纸一样。

我实现了我的渲染器的方法是:在壁纸的服务我有一个独立的线程,将调用Draw方法每隔X秒,GLSurfaceView设置为RENDERMODE_WHEN_DIRTY,所以这个更新线程绘图时,会发生什么决定。

此外在服务中还有一个暂停和恢复方法,当可见性发生变化时。所以即使我退出墙纸,服务也会运行,保存所有事情的状态,直到恢复。

现在对于这个问题,我已经得到了透明度的工作,你可以在这里看到:first time rendering

但是,当我失去焦点,并恢复到壁纸,我按Android的壁纸选择后退按钮,或改变壁纸,然后回到它。事物的alpha值会上升。

这里有2个网格,左边的网格有一个初始的alpha值为0.1,右边的为0.5。 Initial setup, no focus is lost yet

现在,当我离开,回来时,GLSurfaceView onVisibilityChanged方法将被调用,它将按预期工作,但你可以看到阿尔法值会由于某些原因增多,并不断增加,因为我离开,回去:

Exited and went back 1 time 1时间 Exited and went back 2 times 2倍

我已网格图设置在我的片段着色器我将设置均匀的值绘制网格之前的方式,和均匀将由乘纹理颜色。

这里是片段着色器:

precision mediump float; 

uniform vec4 u_color;  
uniform sampler2D u_texture; 
varying vec2 v_textcoord; 

void main() 
{ 
    gl_FragColor = u_color * texture2D(u_texture, v_textcoord); 
} 

当然拉我设置混合和blendfunc网前:

GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

GLES20.glUniform4f(DayAndNightRenderer.BaseShader.GetUniform("u_color"), color.r, color.g, color.b, 0.5f);  

texture.Bind(); 

mesh.Draw(GLES20.GL_TRIANGLE_FAN, DayAndNightRenderer.BaseShader); 

GLES20.glDisable(GLES20.GL_BLEND); 

和网状图,即使颜色制服之前设置绘图:

GLES20.glUniformMatrix4fv(shader.GetUniform("u_transmat"), 1, false, Transform.GetProjectedTransformationMatrix().ToFloatBuffer());  

GLES20.glEnableVertexAttribArray(shader.GetAttribute("a_pos")); 
GLES20.glEnableVertexAttribArray(shader.GetAttribute("a_textcoord")); 

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, VBO[0]); 

GLES20.glVertexAttribPointer(shader.GetAttribute("a_pos"), 3, GLES20.GL_FLOAT, false, Vertex.SIZE, 0); 
GLES20.glVertexAttribPointer(shader.GetAttribute("a_textcoord"), 3, GLES20.GL_FLOAT, false, Vertex.SIZE, Vertex.POS_SIZE); 

GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, IBO[0]);  

GLES20.glDrawElements(primitive, size, GLES20.GL_UNSIGNED_INT, 0);  

GLES20.glDisableVertexAttribArray(shader.GetAttribute("a_textcoord")); 
GLES20.glDisableVertexAttribArray(shader.GetAttribute("a_pos")); 

到目前为止,我已经试过的东西:

  • 改变共混物funcs中,似乎不影响所加入的阿尔法值
  • 重装焦点损失
  • 之间的着色器清除帧缓冲的bug,我设置GLES20.glClearColor(0F,0F ,0f,0f);在开始时调用GLES20.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10。GL_DEPTH_BUFFER_BIT);每一帧

以上都没有工作,它不是一些变量,我用来设置alpha的积累,事物的alpha设置为常量,你可以在代码中看到我设置的颜色制服。

我不知道是什么导致了这种情况,它只发生在失去焦点的壁纸上并回到它上面,在第一次运行时没有返回,它完美地绘制了一切。

这里顺便onVisibilityChanged方法:

@Override 
public void onVisibilityChanged(boolean visible) 
{ 
    super.onVisibilityChanged(visible); 

    if (hassetrenderer) 
    { 
     if (visible) 
     {      
      OpenGLES2WallpaperService.updatehandler.Start(); 
      glsurfaceview.onResume();        
      Log.i("DN", "State: running"); 

     } 
     else 
     { 
      OpenGLES2WallpaperService.updatehandler.Stop(); 
      glsurfaceview.onPause(); 
      Log.i("DN", "State: not running"); 
     } 
    } 
}  

回答

0

嗯,我杀死了壁纸的过程中,当GLSurfaceView被销毁(android.os.Process.killProcess(android.os.Process.myPid固定它()))。

它运行良好,但我不是很满意,它不是着色器,因为即使在片段着色器中将gl_FragColor.a设置为0.5之后,它仍然会发生,所以我仍然不知道是什么造成的它。

永远不要少我会杀死过程作为一种解决方案。