Point sprite desaparece en el borde de la pantalla en mi Galaxy S4 (no en el Nexus 7)
Estoy experimentando con un emisor de partículas basado en este código: https://code.google.com/p/sravan-work/source/browse/trunk/OpenGL+ES2/es2particles/src/es2/learning/ParticleRenderer.java
Actualmente, el emisor de partículas funciona muy bien en mi Nexus 7; los sprites de puntos se generan en el centro de la pantalla y 1) se desvanecen o 2) pasan por el borde de la pantalla.
- Android OpenGL2.0 que muestra texturas negras
- Uso de Matrix. Rotar en OpenGL ES 2.0
- Convertir la textura procesada de OpenGL ES 2.0 en mapa de bits y volver
- Transparencia de OpenGL ES 2.0 mediante pruebas alfa en shader
- Bajo rendimiento al ejecutar eglSwapBuffer y eglMakeCurrent
Por desgracia, en mi Galaxy S4, los sprites de punto desaparecen de la pantalla tan pronto como su punto medio llega al borde de la pantalla. Esto causa un efecto visual realmente desagradable.
Ambos dispositivos ejecutan Android 4.3
Pregunta: ¿Por qué es que los sprites se deslizarán fuera de la pantalla en el (Asus) Nexus 7, pero en el Galaxy S4 de repente desaparecen? ¿Hay algo que se pueda hacer para prevenir la repentina desaparición?
Notas adicionales:
Para el Galaxy S4 lo siguiente está impreso en logcat:
12-03 00:29:15.288: I/Adreno-EGL(31137): <qeglDrvAPI_eglInitialize:316>: EGL 1.4 QUALCOMM build: (CL4169980) 12-03 00:29:15.288: I/Adreno-EGL(31137): OpenGL ES Shader Compiler Version: 17.01.10.SPL 12-03 00:29:15.288: I/Adreno-EGL(31137): Build Date: 09/26/13 Thu
Para el Nexus 7, se imprimirá lo siguiente en logcat:
12-03 00:14:38.144: D/libEGL(25303): loaded /system/lib/egl/libEGL_tegra.so 12-03 00:14:38.154: D/libEGL(25303): loaded /system/lib/egl/libGLESv1_CM_tegra.so 12-03 00:14:38.174: D/libEGL(25303): loaded /system/lib/egl/libGLESv2_tegra.so 12-03 00:14:38.194: D/OpenGLRenderer(25303): Enabling debug mode 0
- GLSurfaceView que muestra negro en Nexus 7 con Android 4.2
- Cómo mejorar el rendimiento de la representación de ping-pong (para desenfoque) en OpenGL ES
- Compartir el contexto EGL2.0 entre 2 GLSurfaceViews causó EGL_BAD_ACCESS en las tabletas Android
- Cómo renderizar vídeo a través de openGLES2 con Android NDK
- No se pueden dibujar vértices con el eje Z en la pantalla
- Dibuja una imagen 2D con OpenGL ES 2.0
- EglCreateWindowSurface falla con java.lang.IllegalArgumentException
- Modificación de la salida de la cámara con SurfaceTexture y OpenGL
Los sprites se basan en un solo punto en su centro, alrededor del cual se dibuja una textura. Si este punto sale del área de representación, se recortan, ya que toda su geometría está técnicamente fuera de la vista.
Puede haber algunas soluciones para evitar el repentino desaparecimiento:
- Se desvanecen manualmente los sprites cuando se aproximan al borde de la pantalla.
- Extienda el área de vista / render para que quede "fuera" de la pantalla (no está seguro si esto es posible).
- Utilice cuadrados con cuatro vértices en lugar de sprites (siempre y cuando un vértice esté en la pantalla, los triángulos relacionados no se cortarán)
Para la opción 3:
Primero tendrá que definir un cuadrado en lugar de un solo punto por partícula:
float verts[] = {-1, 1, 0, 1, 1, 0, 1,-1, 0, -1,-1, 0};
Dependiendo de cómo usted quiere que sus partículas se comporten, usted podría quitar la tercera coordenada de cada vértice y fijarlo a un valor apropiado en el sombreador del vértice también.
En segundo lugar, en lugar de dibujar GLES20.GL_POINTS
, tendrás que dibujar triángulos, con la matriz que GLES20.GL_TRIANGLE_FAN
, GLES20.GL_TRIANGLE_FAN
creará un cuadrado.
También tendrá que establecer la posición y el tamaño de la partícula en el sombreado de vértices. Algo como esto a_Position*size*0.5 + translate
debe hacer el truco. Por supuesto, puede evitar la reducción a la mitad del tamaño si utiliza tamaños más pequeños o hace que los valores de vértice sean más pequeños en la matriz verts[]
. translate
sería la posición calculada de la partícula.
Nota1: recuerde que glPointSize
establece el tamaño en píxeles, pero en este ejemplo el tamaño está en unidades de espacio mundial. Un tamaño de 10 probablemente sería mayor que la pantalla en este ejemplo
Nota2: ya que está utilizando geometría real en lugar de puntos ahora, puede usar una perspective matrix
para hacer que las partículas que están más lejos aparezcan más pequeñas.
- ¿Puedo enviar una aplicación liberada con Eclipse directamente a un dispositivo?
- Google Volley subrayado en nombre de host