Android用Opengl处理二维贴图,完成快速切换的帧动画

cheneylibra 发布于 2016/05/17 14:15
阅读 947
收藏 0

产品要求帧率越高越好,最好能达到60hz,如果有牛人可以实现,这边可以有偿开发。

实现效果:需要把单色帧图片通过快速切换来达到合色的效果,如前三帧图片内容一样,第一帧图片只有红色R,第二帧图片只有颜色G,第三帧图片只有颜色B;接下来三帧图片内容一样,但是区别于前三帧内容,第四帧图片只有颜色R,第五帧图片只有颜色G,第六帧图片只有颜色B,以此类推,也就是RGBRGBRGB...三帧形成白色,我现在写的帧动画程序能达到合成白色,但是有明显闪动,说明帧率没有达到,需要更快。如果我用两帧合色,也就是RGRGRGRG...红和绿快速切换,则能合成黄色,并且没有闪动。

我已尝试过得方案,都没有达到要求的帧率:

方案1:通过在Java层,用Surfaceview做切换动画


public class DemoSurfaceView extends SurfaceView  implements Callback{  
   
    public DemoSurfaceView(Context context) {  
        super(context);  
   
        init(); //初始化,设置生命周期回调方法  
   
    }  
   
    private void init(){  
   
        SurfaceHolder holder = getHolder();  
        holder.addCallback(this); //设置Surface生命周期回调  
   
    }  
   
    @Override  
    public void surfaceChanged(SurfaceHolder holder, int format, int width,  
            int height) {  
    }  
   
    @Override  
    public void surfaceCreated(SurfaceHolder holder) {  
    }  
   
    @Override  
    public void surfaceDestroyed(SurfaceHolder holder) {  
    }  
   
}



方案二:java层达不到速度尝试在jni层做绘制,应用GLSurfaceView做绘图



private static class Renderer implements GLSurfaceView.Renderer {
        public void onDrawFrame(GL10 gl) {
        
        }

        public void onSurfaceChanged(GL10 gl, int width, int height) {
            
        }
        
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        
        }
}


然后在onDrawFrame中调用jni函数,具体opengl绘图在c语言中编写

void renderFrame() {

	glClearColor(grey, grey, grey, 1.0f);
	checkGlError("glClearColor");
	glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
	checkGlError("glClear");

	glUseProgram(gProgram);
	checkGlError("glUseProgram");

	glVertexAttribPointer(gvPositionHandle, 2, GL_FLOAT, GL_FALSE, 0,
			gTriangleVertices);
	checkGlError("glVertexAttribPointer");
	glVertexAttribPointer(gvTexCoorHandle, 2, GL_FLOAT, GL_FALSE, 0, gTexCoor);
	
	checkGlError("glVertexAttribPointer");
	glEnableVertexAttribArray(gvPositionHandle);
	checkGlError("glEnableVertexAttribArray");
	glEnableVertexAttribArray(gvTexCoorHandle);
	checkGlError("glEnableVertexAttribArray");
	glActiveTexture(GL_TEXTURE0);
	checkGlError("glActiveTexture");
	glBindTexture(GL_TEXTURE_2D, mTexture[0]);
	checkGlError("glBindTexture");
	glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
	checkGlError("glDrawArrays");
}



但是上述方案两种方案虽然能有合色效果,但是均有闪烁,说明播放帧率还没达到指定要求,希望有大牛能有更好的解决方案。


加载中
0
t
tch

每3帧切换一个纹理ID,在fragmentshader 中,在shader外面传入一个flag取值为1或2或3的量,在shader中,

gl_FragColor = vec4(0.0 ,0.0 ,0.0 ,1.0);

gl_FragColor[flag] = texture2D(xx,xx)[flag]即可;

返回顶部
顶部