2010-02-03 13 views
5

Estoy haciendo un pequeño experimento con OpenGL ES en Nexus One. Tengo un problema con la resolución de pantalla completa. Parece que nunca puedo obtener la resolución real completa de Nexus One, que es 480 * 800. Estoy utilizando una proyección ortogonal y sólo quiero dibujar un triángulo sencillo con vistas identificación del modelo de matriz:Nunca llegué a 480 * 800 cuando uso proyección ortogonal 2D en OpenGL-ES

@Override 
public void sizeChanged(GL10 gl, int width, int height) { 
     /* 
     * Set our projection matrix. This doesn't have to be done 
     * each time we draw, but usually a new projection needs to 
     * be set when the viewport is resized. 
     */   
     gl.glViewport(0, 0, width, height); 

     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity();   
     GLU.gluOrtho2D(gl, 0, width, 0, height);       
} 

Las coordenadas del triángulo son:

float[] coords = { 
      // X, Y, Z 
      0.0f, 0.0f, 0, 
      200.0f, 200.0f, 0, 
      100.0f, 0.0f, 0, 
    }; 

Y consigo el resultado a continuación:

alt text http://www.anddev.org/files/device_184.png

Este resultado es el mismo en el emulador (480 * 800 res) y Nexus 1. Obviamente no he tenido la resolución completa (debido a que el el vértice superior del triángulo ya está cerca del borde derecho, si el ancho es real 480, debe estar a la izquierda del ancho medio). Otra rareza es que en sizeChanged (estoy usando GLSurfaceView, este es el método de anulación en el renderizador requerido por GLSurfaceView), siempre obtengo width = 480 y height = 800 independientemente de si inicio la aplicación en modo de pantalla completa. Estaba esperando que con la barra de título de la aplicación y la barra de estado, el tamaño pasado a sizeChanged debería ser más pequeño ¿no? Quiero decir, si el tamaño pasado a este método no es el tamaño real que obtengo, ¿cómo puedo configurar una ventana gráfica correcta?

También hice una implementación rápida usando GLUT en Windows con la misma configuración y dibujé exactamente el mismo triángulo. Obtengo el resultado a continuación, que es el resultado esperado. ¿Alguien puede ayudarme a descubrir cómo obtener el mismo resultado en el teléfono?

alt text http://www.anddev.org/files/glut_on_win_137.png

que ya han puesto

<supports-screens 
android:largeScreens="true" 
android:normalScreens="true" 
android:smallScreens="true" 
android:anyDensity="true"/> 

etiqueta en AndroidManifest.xml. En particular, encontré que parece que solo android: anyDensity = "true" | "false" importa, ya que esto cambia el resultado procesado. Otros no cambian el resultado en absoluto. También mi proyecto está en SDK 1.6, que se recomienda para desarrollar aplicaciones que admitan pantallas de teléfonos más grandes.

La pregunta original se le pide también aquí: http://www.anddev.org/viewtopic.php?p=34832#34832

Respuesta

0

Sé que había un hilo de OpenGL que cubre las diferencias entre los 16., 2.0, etc, con detalles formar esos juegos dev etc tendrá que Google en la página principal de Google como la búsqueda lista dev google chupa

también comprobaría el PP de errores como todo el mundo que encuentra errores OpenGL tedns poner aorudns de trabajo en los informes de fallos theri incluido yo

Otros lugares para comprobación de errores db del proyecto alien3d en googlecode su motor de juegos Android en 3D tal vez se encontraron con él?

1

Cuando se ejecuta con la versión 3 del SDK, la aplicación se ejecutará en "modo de compatibilidad"

Se utilizará un estándar de 320x480 | 480x320 res

Así es como me sale un poco de información Visualización:

// we get some display information 
    display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    scrPixelFormat = display.getPixelFormat(); 
    scrWidth = display.getWidth(); 
    scrHeight = display.getHeight(); 
    scrRefreshRate = display.getRefreshRate(); 

Para hacer que mi aplicación utilice el teléfono resolución nativa completa, no me encontré nada así que tuvimos que cambiar a utilizar la versión 6 SDK.

1

Una cosa que debes comprobar es asegurarte de que el atributo android: minSdkVersion del elemento uses-sdk en tu manifiesto es 4 o mayor. Tener un atributo android: targetSdkVersion en ese elemento con 4 o mayor también funcionará.

Su pregunta sí dice que su proyecto es Android 1.6, que es API nivel 4. Es posible tener el objetivo de compilación sea Android 1.6, pero todavía tener niveles API más antiguos especificados en el elemento uses-sdk. Esto sucede a menudo cuando alguien comienza con un proyecto de Android 1.5 y cambia el objetivo de compilación. Eclipse no actualiza el manifiesto al cambiar el objetivo de compilación.

4

Gracias por todas sus respuestas, me ayudaron mucho. Me resultó muy vergonzoso contarle la causa real de este problema, que ahora mismo resolví. ¡La clase de triángulo que copié de una de las muestras realmente escala en las coordenadas que defina en la matriz de posición por el factor de dos! Acabo de modificar las coordenadas de la matriz y no me di cuenta cuando se cargan en el búfer de vértices, ¡se escalan!

Soy culpable ... Pero tengamos cuidado con algo copiado ya que confía en que hace algo de la forma esperada, pero no es así, esta es la clase de triángulo donde copié el código de http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/OpenGLES/Triangle/src/com/google/android/opengles/triangle/TriangleRenderer.java, y observe que en la línea número 215, ¡las posiciones se escalan por 2! Realmente malvado como muestra ...

Además, al usar GLSurfaceView, use android.opengl.GLSurfaceView en lugar de GLSurfaceView.java en su carpeta de muestra sdk_root \ platforms \ android-1.1 \ samples \ ApiDemos \ src \ com \ example \ android \ apis \ graphics. Como este último es una versión temprana y tiene algunos comportamientos extraños.

Cuestiones relacionadas