Addev
Addev

Reputation: 32263

Android OpenGL Black Screen between frames

I'm starting with open GL and have a little problem, I'm trying to paint the screen with a solid (and random) color, but it shown a high refresh with the color. I inserted a sleep in the method onDrawFrame for seeing whats happening and the result is: black screen - colored screen - black screen - colored screen ... refreshing every second. What am I doing wrong? Thats my code:

package com.example.opengltest;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.Random;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity implements Renderer {

    GLSurfaceView glView;
    GL10 gl;
    Object stateChanged = new Object();
    Random rand = new Random();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        glView = new GLSurfaceView(this);
        glView.setRenderer(this);
        setContentView(glView);
    }

    private void paint() {
        Log.i("OPENGL","paint");
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        gl.glClearColor(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(),
                1);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        gl.glViewport(0, 0, glView.getWidth(), glView.getHeight());
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrthof(0, 320, 0, 480, 1, -1);

        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(3 * 2 * 4);
        byteBuffer.order(ByteOrder.nativeOrder());
        FloatBuffer vertices = byteBuffer.asFloatBuffer();
        vertices.put(new float[] { 0.0f, 0.0f,
        319.0f, 0.0f,
        160.0f, 479.0f });
        vertices.flip();


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    protected void onPause() {
        super.onPause();
        glView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        glView.onResume();
    }

    public void onDrawFrame(GL10 gl) {
        Log.i("OPENGL","onDrawFrame");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Log.i("OPENGL","onSurfaceChanged");

    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        this.gl = gl;
        Log.i("OPENGL","onSurfaceCreated");paint();

    }

}

Upvotes: 0

Views: 1451

Answers (1)

redorav
redorav

Reputation: 962

You are calling your paint() method in onSurfaceChanged whereas you should call some of its contents in onDrawFrame(), and never use the sleep function inside a GL thread, it will only cause black screens flickering all over.

In particular, try moving

gl.glClear(GL10.GL_COLOR_BUFFER_BIT); // Clear the color buffer
gl.glClearColor(rand.nextFloat(), rand.nextFloat(), rand.nextFloat(), 1); // Clear it with a random color

to the onDrawFrame function, and I don't know exactly why you're calling glClear() twice in paint(), but that's a mistake, you're clearing what you just painted with a random color! So delete that second call to onClear() and I think you should be fine. Actually, I don't even think you need the first glClear() call, because you're already clearing it with glClearColor, although if you do introduce some alpha transparency then you're better off having both (or else they will sum up).

Let us know if that helped!

Upvotes: 2

Related Questions