2012-08-01 81 views
0

我开始与开放GL,有一个小问题,我试图绘制一个固体(和随机)颜色的屏幕,但它显示了一个高颜色刷新。我在onDrawFrame方法中插入了一个睡眠,以查看发生了什么,结果是:黑屏 - 彩色屏幕 - 黑屏 - 彩色屏幕...每秒刷新一次。我究竟做错了什么?这就是我的代码:框架之间的Android OpenGL黑色屏幕

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(); 

    } 

} 
+0

你为什么介绍睡眠线程? – VinceFR 2012-08-01 10:11:59

+0

这将是看看问题出在他的'Renderer.onDrawFrame()'或其他地方。它似乎在别的地方。 – tolgap 2012-08-01 10:16:00

+0

好吧,所以我不明白(也许我不是唯一的一个)你的意思是'它显示了高的刷新颜色' – VinceFR 2012-08-01 10:17:41

回答

2

你在呼唤你的paint()方法onSurfaceChanged而你应该调用它的一些内容onDrawFrame(),切勿使用GL线程内的休眠功能,它只会导致黑屏闪烁各地。

特别是,尝试移动

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 

到onDrawFrame功能,我不知道为什么你在paint()调用glClear()两次,但是这是一个错误,你清除你刚才涂上随机的颜色!所以删除第二次调用onClear(),我认为你应该没问题。实际上,我甚至不认为你需要第一次glClear()调用,因为你已经用glClearColor清除了它,但是如果你确实引入了一些alpha透明度,那么你最好拥有两个(或者他们总结一下)。

让我们知道是否有帮助!