4 Stimmen

Funktionieren OpenGL-Punkt-Sprites in Android?

Ich entwickle auf einem Droid, Version 2.1-update1. Meine unterstützten GL-Erweiterungen sind GL_OES_point_sprite und GL_OES_point_size_array.

Ich bin nicht in der Lage, Punkt-Sprites zum Rendern zu bringen. Der folgende Code löst UnsupportedOperationException von GLWrapperBase beim glTexEnvi-Aufruf aus. Wenn ich Texturen deaktivieren und kommentieren Sie die glTexEnvi alle, wirft es die gleiche Ausnahme weiter unten, bei glPointSizePointerOES().

Werden Punktsprites in Android richtig unterstützt? Hat jemand sie zum Laufen gebracht? Oder gibt es ein Problem mit meinem Code unten?

// 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);

Danke

5voto

HaMMeReD Punkte 2430

Ich habe dies funktioniert, hier ist meine Draw-Funktion

Alles initialisieren

    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);

Einrichten der Texturumgebung zur Verwendung von Punkt-Sprites

    gl.glTexEnvf(GL11.GL_POINT_SPRITE_OES, GL11.GL_COORD_REPLACE_OES, GL11.GL_TRUE);

Einrichten von Zeigern auf die Daten (das erste Array ist 2d angelegt [x,y,x2,y2,...] das zweite ist 1d [s1,s2,...])

    gl.glVertexPointer(2,GL11.GL_FLOAT,0,PosData);              
    ((GL11)(gl)).glPointSizePointerOES(GL10.GL_FLOAT, 0, SizeData);

Zeichnen Sie

    gl.glDrawArrays(GL10.GL_POINTS,0,MAX);

Sachen deaktivieren

    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);

In meinem Initialisierer habe ich nur meine Projektion Setup und GL_BLEND für Blending aktiviert. Ich denke, Sie würden GL_COLOR_MATERIAL benötigen, wenn Sie Ihre Sprite Farbe wollte.

1voto

Ernir Erlingsson Punkte 2110

Ich habe die Punktsprites mit ES 1.1 & 2 auf einem Nexus One zum Laufen gebracht. Ich benutze eine feste Punktgröße, so dass ich nicht haben, um eine Größe Puffer zu verwenden, aber Sie können meinen Code verwenden, um zuerst bekommen es funktioniert und dann die Größe Puffer hinzufügen.

Bei meiner Auslosungsmethode:

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);

0voto

James Coote Punkte 1955

Wenn Sie wie ich Folgendes verwenden MatrixTrackingGL Sie müssen glTexEnvf anstelle von glTexEnvi verwenden (f statt i am Ende) und Sie müssen in MatrixTrackingGL gehen und glPointSizePointerOES ändern:

public void glPointSizePointerOES(int type, int stride, Buffer pointer) {
    mgl11.glPointSizePointerOES(type, stride, pointer);
    //throw new UnsupportedOperationException();
}

Ich bin sicher, dass es einen guten Grund gibt, warum es nicht unterstützt wird, aber ich kenne ihn nicht und es funktioniert bei mir auf einem ZTE Blade mit Android 2.1


Für alle, die es interessiert: MatrixTrackerGL kommt von C:\Program Dateien \android -sdk-Windows \samples\android -7 \ApiDemos\src\com\example\android\apis\graphics\spritetext

Sie wird beim Einrichten der GLSurface-Ansicht verwendet:

// 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);

und bedeutet, dass Sie GLU.gluUnProject für die Kommissionierung verwenden können:

        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);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X