¿Los OpenGL Point Sprites funcionan en Android?
Estoy desarrollando en un Droid, versión 2.1-update1. Mis extensiones GL soportadas incluyen GL_OES_point_sprite y GL_OES_point_size_array.
Soy incapaz de conseguir sprites de punto para hacer. El código siguiente arroja UnsupportedOperationException de GLWrapperBase en la llamada glTexEnvi. Si deshabilito las texturas y comento el glTexEnvi todo, arroja la misma excepción más abajo, en glPointSizePointerOES ().
- Dibuja una imagen 2D con OpenGL ES 2.0
- Crear un gráfico al azar, seno como sprite paisaje
- Andengine Sprites aparecen como cajas negras
- Android gl abierto más lento que la tela?
- J2ME como Sprite en Android
¿Están los sprites puntuales correctamente soportados en Android? ¿Alguien los ha conseguido trabajando? ¿O hay un problema con mi código de abajo?
// Note that gl is cast to GL11 gl.glEnable(GL11.GL_TEXTURE_2D); gl.glEnable(GL11.GL_BLEND); gl.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); gl.glDepthMask(false); gl.glEnable(GL11.GL_POINT_SPRITE_OES); gl.glTexEnvi( GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES, GL11.GL_TRUE ); gl.glEnableClientState(GL11.GL_VERTEX_ARRAY); gl.glVertexPointer(2, GL11.GL_SHORT, 0, .vertBuffer); gl.glEnableClientState(GL11.GL_POINT_SIZE_ARRAY_OES); gl.glPointSizePointerOES(GL11.GL_FLOAT, 0, pointSizeBuffer);
Gracias
- Texturas en OpenGL ES 2.0 para Android
- Android: animación de tween de un mapa de bits
- Convertir juego Spritekit a Android?
- Búsqueda de píxeles de borde de una imagen con envolvente transparente (para detección de colisión)
- AndEngine- Dibujo del niño del sprite detrás de su padre
- libgdx spritebatch no dibuja basado en el origen de una textura
- Los colores de ShapeRenderer dejan de funcionar al renderizar imágenes con SpriteBatch
- Cómo dibujar LibGDX Sprite de Constructor en blanco
Tengo este trabajo, aquí está mi función de dibujo
Inicializar todo
gl.glEnable(GL10.GL_TEXTURE); TextureManager.activateTexture(gl, R.drawable.water1); //Don't look for this, it's not public api, just looks upd texture id for android resource if loaded, and then activates it. it's the gl.glBindTexture() call replacement gl.glEnable(GL11.GL_POINT_SPRITE_OES); gl.glEnableClientState(GL11.GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES); gl.glEnableClientState(GL11.GL_POINT_SIZE_ARRAY_OES); gl.glEnableClientState(GL11.GL_POINT_SPRITE_OES); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
Establezca el entorno de textura para usar sprites de puntos
gl.glTexEnvf(GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES, GL11.GL_TRUE);
Establecer punteros a los datos (Primera matriz es 2d establecidos [x, y, x2, y2, …] segundo es 1d [s1, s2, ..])
gl.glVertexPointer(2,GL11.GL_FLOAT,0,PosData); ((GL11)(gl)).glPointSizePointerOES(GL10.GL_FLOAT, 0, SizeData);
Dibujar
gl.glDrawArrays(GL10.GL_POINTS,0,MAX);
Desactivar las cosas
gl.glDisableClientState(GL11.GL_VERTEX_ARRAY); gl.glDisableClientState(GL11.GL_POINT_SIZE_ARRAY_OES); gl.glDisableClientState(GL11.GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES); gl.glDisableClientState(GL11.GL_POINT_SIZE_ARRAY_OES); gl.glDisable(GL10.GL_TEXTURE);
En mi inicializador sólo tengo mi configuración de proyección y GL_BLEND habilitado para mezclar. Creo que necesitarías GL_COLOR_MATERIAL si quisieras colorear tu sprite.
Tengo el punto sprites trabajando con ES 1.1 y 2 en un nexo uno. Utilizo un tamaño de punto fijo así que no tuve que usar un almacenador intermediario del tamaño pero usted puede utilizar mi código conseguirlo primero el trabajar y después agregar el almacenador intermediario del tamaño.
En mi método de dibujo:
gl.glEnable(GL11.GL_POINT_SPRITE_OES); gl.glTexEnvf(GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES, GL11.GL_TRUE); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); // 2 dimensional array, (x1,y1, x2, y2, ...). gl.glVertexPointer(2, GL10.GL_FLOAT, 0, mVerticesBuffer); gl.glEnable(GL10.GL_TEXTURE_2D); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId); gl.glPointSize(32); // Fixed point size for all points // This only worked with GLES11 & GLES20. GLES11.glDrawArrays(GLES11.GL_POINTS, 0, vertices.length); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisable(GL10.GL_TEXTURE_2D); gl.glDisable(GL11.GL_POINT_SPRITE_OES);
Si como yo estás usando MatrixTrackingGL tienes que usar glTexEnvf en lugar de glTexEnvi (no f al final) y necesitas ir a MatrixTrackingGL y cambiar glPointSizePointerOES:
public void glPointSizePointerOES(int type, int stride, Buffer pointer) { mgl11.glPointSizePointerOES(type, stride, pointer); //throw new UnsupportedOperationException(); }
Estoy seguro de que hay una buena razón por la que no es compatible en el primer lugar, pero no lo sé y funciona para mí en un ZTE Blade ejecutando android 2.1
Para cualquiera que se pregunte, MatrixTrackerGL viene de C: \ Archivos de programa \ android-sdk-windows \ samples \ android-7 \ ApiDemos \ src \ com \ ejemplo \ android \ apis \ graphics \ spritetext
Se utiliza al configurar su GLSurface View:
// GraphicsRenderer is my implementation of Renderer Graphics Renderer graphicsRenderer = new GraphicsRenderer(this); GLSurfaceView mGLView = (GLSurfaceView) findViewById(R.id.graphics_glsurfaceview1); mGLView.setGLWrapper(new GLSurfaceView.GLWrapper() { public GL wrap(GL gl) { return new MatrixTrackingGL(gl); }}); mGLView.setEGLConfigChooser(true); mGLView.setRenderer(graphicsRenderer);
Y significa que puedes usar GLU.gluUnProject para hacer picking !:
MatrixGrabber matrixGrabber = new MatrixGrabber(); matrixGrabber.getCurrentModelView(gl); matrixGrabber.getCurrentProjection(gl); float[] vector = new float[4]; GLU.gluUnProject(x, y, 0f, matrixGrabber.mModelView, 0, matrixGrabber.mProjection, 0, new int[]{mGLView .getTop(),mGLView .getLeft(),mGLView .getWidth(),mGLView .getHeight()}, 0, vector, 0);
- Comandos de Android Terminal Emulator
- El camino más rápido hacia el desarrollo de Android para un programador que no sea de Java