Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Tratar de dibujar triángulos con textura en el dispositivo falla, pero el emulador funciona. ¿Por qué?

Tengo una serie de llamadas OpenGL-ES que renderizan correctamente un triángulo y lo texturizan con mezcla alfa en el emulador (2.0.1). Cuando disparo el mismo código en un dispositivo real (Droid 2.0.1), todo lo que consigo son cuadrados blancos.

Esto me sugiere que las texturas no se están cargando, pero no puedo entender por qué no se están cargando. Todas mis texturas son PNG de 32 bits con canales alfa, bajo res / raw por lo que no están optimizados por los documentos sdk .

Así es como estoy cargando mis texturas:

private void loadGLTexture(GL10 gl, Context context, int reasource_id, int texture_id) { //Get the texture from the Android resource directory Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), reasource_id, sBitmapOptions); //Generate one texture pointer... gl.glGenTextures(1, textures, texture_id); //...and bind it to our array gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[texture_id]); //Create Nearest Filtered Texture gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); //Different possible texture parameters, eg GL10.GL_CLAMP_TO_EDGE gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); //Clean up bitmap.recycle(); } 

Aquí es cómo estoy haciendo la textura:

  //Clear gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //Enable vertex buffer gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); //Push transformation matrix gl.glPushMatrix(); //Transformation matrices gl.glTranslatef(x, y, 0.0f); gl.glScalef(scalefactor, scalefactor, 0.0f); gl.glColor4f(1.0f,1.0f,1.0f,1.0f); //Bind the texture gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[textureid]); //Draw the vertices as triangles gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); //Pop the matrix back to where we left it gl.glPopMatrix(); //Disable the client state before leaving gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

Y aquí están las opciones que he habilitado:

  gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA); 

Edit: Acabo de probar el suministro de un BitmapOptions a la llamada BitmapFactory.decodeResource (), pero esto no parece arreglar el problema, a pesar de establecer manualmente el mismo preferredconfig, densidad y targetdensity.

Edit2: Según lo solicitado, aquí hay una captura de pantalla del emulador de trabajo. Los triángulos subyacentes se muestran con una textura de círculo sobre el que se ve, la transparencia está funcionando porque se puede ver el fondo negro.

Eliminado muerto ImageShack link

Aquí está una foto de lo que el droide hace con el mismo código exacto en él:

Eliminado muerto ImageShack link

Edit3: Aquí están mis BitmapOptions, actualizado la llamada anterior con la forma en que ahora estoy llamando a la BitmapFactory, sigue los mismos resultados que a continuación: sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565;

 sBitmapOptions.inDensity = 160; sBitmapOptions.inTargetDensity = 160; sBitmapOptions.inScreenDensity = 160; sBitmapOptions.inDither = false; sBitmapOptions.inSampleSize = 1; sBitmapOptions.inScaled = false; 

Aquí están mis vértices, coords de textura e índices:

  /** The initial vertex definition */ private static final float vertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f }; /** The initial texture coordinates (u, v) */ private static final float texture[] = { //Mapping coordinates for the vertices 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f }; /** The initial indices definition */ private static final byte indices[] = { //Faces definition 0,1,3, 0,3,2 }; 

¿Hay de todos modos para volcar el contenido de la textura una vez que se ha cargado en OpenGL ES? ¿Puedo comparar la textura cargada del emulador con la textura cargada del dispositivo real?

Lo intenté con una textura diferente (el icono del androide del defecto) y otra vez, trabaja muy bien para el emulador pero falla rendir en el teléfono real.

Edit4: intentó cambiar cuando hago la carga de la textura. Sin suerte. Intentó usar un desplazamiento constante de 0 a glGenTextures, sin cambios.

¿Hay algo que estoy usando que el emulador apoya que el teléfono real no?

Edit5: Por Ryan abajo, he cambiado el tamaño de mi textura de 200×200 a 256×256, y el problema no se resolvió.

Editar: Según lo solicitado, agregó las llamadas a glVertexPointer y glTexCoordPointer anteriores. Además, aquí está la inicialización de vertexBuffer, textureBuffer e indexBuffer:

 ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); byteBuf.order(ByteOrder.nativeOrder()); vertexBuffer = byteBuf.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); byteBuf = ByteBuffer.allocateDirect(texture.length * 4); byteBuf.order(ByteOrder.nativeOrder()); textureBuffer = byteBuf.asFloatBuffer(); textureBuffer.put(texture); textureBuffer.position(0); indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); loadGLTextures(gl, this.context); 

  • Cómo ajustar el tono de un código de color?
  • Diferencia entre e.getMessage () y e.getLocalizedMessage ()
  • Actualización de Android TextView en subprocesos y ejecución
  • Botón con AMBOS color e imagen de fondo
  • Terminación de proceso anormal del instalador de aplicaciones
  • Imagen de relleno de selector xml
  • Android Lollipop: ImageView ignorando el atributo fitsSystemWindows (barra de estado transparente)
  • Prueba de uso de la batería
  • 7 Solutions collect form web for “Tratar de dibujar triángulos con textura en el dispositivo falla, pero el emulador funciona. ¿Por qué?”

    Im también nuevo para Android OpenGL ES dev. Tengo un Milestone (versión en euros para Droid).

    De lo que puedo ver hasta ahora, disparando varias aplicaciones tutoriales de diferentes libros / sitios web en mi hito, parece que este teléfono manejar OpenGL ES de una manera diferente a todos los demás teléfonos Android lanzado hasta ahora.

    Creo que está relacionado con las extensiones OpenGL soportadas en el dispositivo.

    Compruebe este acoplamiento para la lista de las extensiones apoyadas, im bastante seguro que un gurú del código encontrará porqué exactamente el droid está manejando opengl es en una manera tan extraña.

    http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs

    Espero que esto ayude un poco


    EDITADO:

    Reformé el manifiesto.xml y noté cuando usé

     <uses-sdk android:minSdkVersion="6"/> 

    Los recursos no se cargan en absoluto.

    Cuando usas

     <uses-sdk android:minSdkVersion="3"/> 

    Los recursos se cargan bien.

    Así que cambié de nuevo a

     <uses-sdk android:minSdkVersion="6"/> 

    Y cambió la forma en que se carga el mapa de bits.

    Trate de reemplazar:

      //Get the texture from the Android resource directory Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), reasource_id, sBitmapOptions); 

    con :

     InputStream is = context.getResources().openRawResource(your.resource.there); Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(is); } finally { //Always clear and close try { is.close(); is = null; } catch (IOException e) { } } 

    Las texturas están cargando muy bien en mi hito con ese código, espero que este trabajo para el suyo!

    Tuve exactamente este problema cuando me mudé de SDK 3 a 4. Mis texturas se mostraría en el emulador, pero no en el dispositivo real (Motorola Milestone / Droid).

    Todas tus texturas deben ser poderes binarios de dos. Los míos eran 256×256. Sin embargo, la razón por la que las texturas no se muestran es que el sistema operativo los está escalando desde sus tamaños de potencia binarios para mostrarlos en la pantalla de alta densidad del Milestone.

    La solución es fácil: basta con mover las texturas al directorio nodpi y el sistema operativo no las escalará cuando las cargue.

    Asegúrese de cargar sus mapas de bits con un BitmapConfig adecuado que no está escalando su imagen detrás de las escenas, porque esto sucede.

    Además, ¿hay una razón por la que está almacenando sus pngs en / raw / en lugar de / drawable /?

    La respuesta editada de Dullahx resolvió mi problema en el mismo asunto. Muchas gracias, me estaba molestando los últimos dos días!

    Estaba tratando de mapear una textura en la pestaña galaxia de Samsung, que se muestra con éxito en el emulador, pero sólo el avión se muestra en el dispositivo.

    He reemplazado mi código:

     plane.loadBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.jay)); 

    Con este:

     InputStream is = context.getResources().openRawResource(R.drawable.jay); // Load the texture. plane.loadBitmap(BitmapFactory.decodeStream(is)); 

    Y funcionó en el dispositivo también!

    Pero tenga cuidado con la minSdkVersion si también está tratando de asignar una textura en un rectángulo de tamaño de pantalla completa como yo. Si yo uso

      <uses-sdk android:minSdkVersion="3"/> 

    En la lengüeta de la galaxia de Samsung, mi avión no fue rendido fullscreen. Se procesó de acuerdo con el tamaño de pantalla completa de un dispositivo que utiliza sdk versión 3. He cambiado esto a

     <uses-sdk android:minSdkVersion="8"/> 

    Y mi rectángulo de pantalla completa está de vuelta con su textura.

    Espero que esto ayude, también.

    No estoy seguro de cuál es su problema, soy bastante nuevo para el desarrollo en general, pero mi OpenGL problemas de Android con la diferencia entre el emulador y el teléfono fueron:

    -Emulador puede soportar no 2 x dimensiones para bitmaps, teléfono no puede -Emulador volteado pantalla en NDK para openGL por lo que tuve que utilizar coordenadas negativas para definir la vista en el emulador, mientras que mi G1 utiliza las coordenadas no negado.

    Espero que esto sea capaz de ayudarle de alguna manera.

    Creo que tal vez que usted está teniendo problemas para cargar la textura de la APK. Trate de copiar la textura a la tarjeta SD y ver si puede cargar desde allí.

    ¿Está utilizando la interfaz GL11 en alguna parte? GL11 no es compatible con todos los dispositivos. Y también quitar la línea glColor, tal vez su textura se muestra, pero sobre-pintado por el color? Aquí un fragmento de código cómo mostrar mi textura-mallas:

     void draw(GL10 gl) { // Enabled the vertices buffer for writing and to be used during // rendering. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // Specifies the location and data format of an array of vertex // coordinates to use when rendering. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); gl.glBindTexture(GL10.GL_TEXTURE_2D, myTextureId); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); gl.glDrawArrays(drawMode, 0, verticesCount); gl.glDisable(GL10.GL_TEXTURE_2D); // Disable the vertices buffer. gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.