2010-08-30 14 views
8

Ich versuche, das Canvas-basierte Rendering-System zu ersetzen, die ich bereits mit der schnelleren opengl-es-Oberfläche habe, aber ich kann nicht scheinen, einen OpenGL-Renderer zu erhalten so, dass es als 2d-Feld wirkt, anstatt eine perspektivische Ansicht.Mit OpenGL Canvas ersetzen - Android

Meine aktuellen Code für den Renderer sieht wie folgt aus:

 @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     gl.glViewport(0, 0, width, height); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrthof(0.0f, width, 0.0f, height, 0.0f, 1.0f); 

     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glEnable(GL10.GL_BLEND); 
     gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
     gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 

     gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
     gl.glShadeModel(GL10.GL_FLAT); 
     gl.glDisable(GL10.GL_DEPTH_TEST); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 

     gl.glDisable(GL10.GL_DITHER); 
     gl.glDisable(GL10.GL_LIGHTING); 

     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
    } 

Wie würde ich Setup der Renderer, so dass die Transformation mit den Pixel auf dem Bildschirm übereinstimmen übersetzen würde? (Wenn also 5 nach rechts verschoben wird, werden 5 Pixel verschoben)

+0

Warum nicht einfach eine GL-Instanz an den Canvas-Konstruktor übergeben. http://developer.android.com/reference/android/graphics/Canvas.html –

+0

Wäre das OpenGL Geschwindigkeitsvorteile gegenüber dem grundlegenden Canvas beim Zeichnen von Bitmaps? – GuyNoir

+0

Verwenden Sie Canvas nicht dafür. Es funktioniert nicht, obwohl es dokumentiert ist. Laut den Vorträgen im IRC hat der Entwickler von Canvas das Programm bereits aus der API für zukünftige Versionen entfernt. – Moncader

Antwort

9

Bitte beachten Sie, dass in openGL die Y-Koordinate invertiert ist. Ansonsten ist alles gleich.
Was die richtigen Flags, empfehle ich Ihnen die Android-Spiel Replik Insel Open-Source-Check-out: http://code.google.com/p/replicaisland/

Hier ist, was ich in meinem eigenen Code verwenden:

public void onSurfaceChanged(GL10 gl, int width, int height) 
{ 
    mViewWidth = width; 
    mViewHeight = height; 

    gl.glViewport(0, 0, mViewWidth, mViewHeight); 
    gl.glLoadIdentity(); 
    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); 
} 

public void onSurfaceCreated(GL10 gl, EGLConfig config) 
{ 
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA); 

    gl.glViewport(0, 0, mViewWidth, mViewHeight); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 
    gl.glShadeModel(GL10.GL_FLAT); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 

    GLU.gluOrtho2D(gl, 0, mViewWidth, mViewHeight, 0); 
} 

Wo mViewWidth & mViewHeight sind die Größe der der Bildschirm.

+0

Ich habe, aber der Code ist so dick mit Optimierungen und Kachel-basierten Systemen, dass es ziemlich nutzlos ist, den einfachen Code zu finden, den ich brauche, um ein paar Texturen auf den Bildschirm zu rendern. – GuyNoir

+0

Ich hatte ein ähnliches Problem und hatte kein Problem, den Teil zu finden, wo der Autor der Replika-Inseln die Gl-Leinwand aufbaute. Es ist in der Datei namens GameRenderer.java. Ich habe meine ursprüngliche Antwort bearbeitet, um den von mir verwendeten Setup-Code einzuschließen. –

+0

Okay, danke. Obwohl es immer noch nicht ganz funktioniert in Bezug auf den Übergang meiner gesamten Code-Struktur. Gibt es eine Möglichkeit, Texturen in Nicht-Basis-2-Größen zu speichern? Wenn nicht, lohnt es sich sowieso nicht, openGL zu benutzen (ich drücke bereits die Speichergrenzen von Android). – GuyNoir