2012-09-29 30 views
12

¿Hay alguna configuración de emulador especial necesaria para ejecutar las aplicaciones OpenGL?El ejemplo del fondo de pantalla GL solo muestra la pantalla verde en el emulador, pero está funcionando en el dispositivo

Ya configuré la propiedad "emulación de GPU" en "sí".

Estoy tratando de ejecutar un fondo de pantalla en vivo de Android, usando la fuente de muestra encontrada en this link, el resultado deseado es un triángulo giratorio.

Después de un pequeño esfuerzo, ejecuté la aplicación pero no dibuja nada en el emulador, pero cuando probé en el dispositivo funciona, pero en el emulador solo muestra una pantalla verde, encontré una discusión sobre ella en Google groups here. Traté de configurar el puerto de visualización como se dice en él. Pero todavía no muestra ningún resultado, en la superficie cambió He añadido esta línea

gl.glViewport (0, 0, ancho, alto);

¿Es esta la forma correcta de establecer el puerto de visualización?

Ésta es mi clase render,

public class MyRenderer implements GLWallpaperService.Renderer { 
    GLTriangle mTriangle; 

    public void onDrawFrame(GL10 gl) { 


     gl.glClearColor(0.2f, 0.4f, 0.2f, 1f); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     autoRotate(gl); 
     gl.glColor4f(.2f, 0f, .5f, 1f); 

     mTriangle.draw(gl); 
    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 

     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     GLU.gluPerspective(gl, 60f, (float)width/(float)height, 1f, 100f); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     gl.glTranslatef(0, 0, -5); 
    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     mTriangle = new GLTriangle(); 



     gl.glClearDepthf(1f); 
     gl.glEnable(GL10.GL_DEPTH_TEST); 
     gl.glDepthFunc(GL10.GL_LEQUAL); 
    } 

    /** 
    * Called when the engine is destroyed. Do any necessary clean up because 
    * at this point your renderer instance is now done for. 
    */ 
    public void release() { 

    } 

    private void autoRotate(GL10 gl) { 
     gl.glRotatef(1, 0, 1, 0); 
     gl.glRotatef(0.5f, 1, 0, 0); 
    } 
} 

Herse es de clase GLTriangle

import java.nio.FloatBuffer; 
import java.nio.ShortBuffer; 

import javax.microedition.khronos.opengles.GL10; 

public class GLTriangle { 
    private FloatBuffer _vertexBuffer; 
    private final int _nrOfVertices = 3; 

    private ShortBuffer _indexBuffer; 

    public GLTriangle() { 
     init(); 
    } 

    private void init() { 
     // We use ByteBuffer.allocateDirect() to get memory outside of 
     // the normal, garbage collected heap. I think this is done 
     // because the buffer is subject to native I/O. 
     // See http://download.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html#direct 

     // 3 is the number of coordinates to each vertex. 
     _vertexBuffer = BufferFactory.createFloatBuffer(_nrOfVertices * 3); 

     _indexBuffer = BufferFactory.createShortBuffer(_nrOfVertices); 

     // Coordinates for the vertexes of the triangle. 
     float[] coords = { 
       -1f, -1f, 0f, // (x1, y1, z1) 
       1f, -1f, 0f, // (x2, y2, z2) 
       0f, 1f, 0f // (x3, y3, z3) 
     }; 

     short[] _indicesArray = {0, 1, 2}; 

     _vertexBuffer.put(coords); 
     _indexBuffer.put(_indicesArray); 

     _vertexBuffer.position(0); 
     _indexBuffer.position(0); 
    } 

    public void draw(GL10 gl) { 
     // 3 coordinates in each vertex 
     // 0 is the space between each vertex. They are densely packed 
     // in the array, so the value is 0 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, getVertexBuffer()); 

     // Draw the primitives, in this case, triangles. 
     gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer); 
    } 

    private FloatBuffer getVertexBuffer() { 
     return _vertexBuffer; 
    } 
} 

lo que va mal aquí? ¿Hay un mejor código de muestra para el fondo de pantalla en vivo de Open GL?

+1

En la configuración del emulador AVD, tengo establece la propiedad "emulación de la GPU" a "sí" ? En la configuración de AVD, esa es también la propiedad 'hw.gpu.enabled'. – kelnos

+0

Sí, ya configuré la propiedad "emulación de GPU" en "sí", pero Sory no entiendo lo que quiere decir con "En la configuración de AVD esa también es la propiedad hw.gpu.enabled" –

Respuesta

2

POR FIN lo encontré ..

Lo que necesito hacer es añadir

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

a onSurfaceCreated método junto con la línea de código

gl.glViewport(0, 0, width, height); 

en el onSurfaceChanged método en MyRenderer Cl culo

me encontré con una pregunta similar en stack itself[Pero solución funcionó para mí no está marcada como correcta :(]

Cuestiones relacionadas