Home Blog erstellt am: : 12/03/08 Zuletzt aktualisiert : 03/01/10 18:47 / 126 veröffentlichte Einträge
 

b) OpenGL ES 2 iPhone Schritt für Schritt

b1) OpenGL ES 2 (OGLes2Basic)  (b) OpenGL ES 2 iPhone Schritt für Schritt) Verfasst: Donnerstag, den 10. Dezember 2009 02:58

ich gebe zu die a) Serie war etwas dahingeklatschht ohne Erklärung ... also diesemal dann alles wirklich Schritt für Schritt - ich versuch auch wirklich kleinlich zu sein {#}.

Erstaml was ist der Unetrschied ES1 & ES2 ?:

Infos aus Wiki:

OpenGL ES (Open Graphics Library for Embedded Systems) ist eine Spezifikation für ein plattform- und programmiersprachenunabhängiges API (Application Programming Interface) zur Entwicklung von 3D-Computergrafik. Die Spezifikation beschreibt eine vereinfachte Version der OpenGL Spezifikation welche sich besonders für den Einsatz im Bereich von eingebetteten Systemen eignet.

OpenGL ES wird, im Gegensatz zu OpenGL, in zwei separaten Zweigen spezifiziert. Der Zweig 1.x definiert eine Schnittstelle zu Hardware ohne Vertex- oder Fragmentshader. Der 2.x Zweig definiert eine Schnittstelle für Grafikchips mit Shadern.

  • OpenGL ES 1.0
    • Gegen OpenGL 1.3 spezifiziert
  • OpenGL ES 1.1
    • Gegen OpenGL 1.5 spezifiziert
    • Erleichtert Hardwarebeschleunigung
    • Rückwärtskompatibel zur Version 1.0
  • OpenGL ES 2.0
    • Gegen OpenGL 2.0 spezifiziert
    • Nicht rückwärtskompatibel
    • Nur programmierbare Hardware mit Vertex- und Fragmentshadern wird unterstützt

mehr Infos : http://de.wikipedia.org/wiki/OpenGL_ES

ES2 wird zur Zeit nur vom G3S unterstützt !

Und los gehts wie immer ein neues Projekt ... diesesmal wird es OGLes2Basic heissen...

Xcode neuse Projekt -> Winodw-based Application

Das Apple Startprogramm OpenGL ES Applkication ist zwar ganz nett und man wird es auch nach dieser Lektüre hoffentlich verstehn und nutzen können, aber für eine Schritt für Schritt Erklärung mal wieder etwa zu GUT programmiert ...

und schon geht das löschen los mit b2)

Permalink

b2) OGLes2Basic anpassen  (b) OpenGL ES 2 iPhone Schritt für Schritt) Verfasst: Donnerstag, den 10. Dezember 2009 03:58

OGLes2BasicAppDelegate.h einfach löschen ... ja diesesmal wir der header mit in die OGLes2BasicAppDelegate.m implementiert (siehe b3))

die xib MainWinodw Datei wird gelöscht

Plist wird angepasst NIB wird geändert in Statusbar hidden (siehe Bild)

Framework OpenGLES und QuartzCore adden.

main.m: Inhalt ändern :

int main(int argc, char **argv)
{
 NSAutoreleasePool* pool = [NSAutoreleasePool new];
 UIApplicationMain(argc, argv, nil, @"EAGL_Ansicht");
 [pool release];
 return 0;
}

nach b3 kann man das Projekt auch wieder starten...

 

Permalink

b3) Inhalt: OGLes2BasicAppDelegate.m  (b) OpenGL ES 2 iPhone Schritt für Schritt) Verfasst: Donnerstag, den 10. Dezember 2009 04:13

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>
#import <OpenGLES/EAGL.h>
#import <OpenGLES/EAGLDrawable.h>
#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>

@interface EAGL_Ansicht : UIView
{
@private
 UIWindow*   mein_Fenster;
}

- (void)applicationDidFinishLaunching: (UIApplication *)application;
- (void) dealloc;
@end

@implementation EAGL_Ansicht

- (void)applicationDidFinishLaunching: (UIApplication *)application { 

 // 1.  - Erstellung des Fenster
 NSLog(@"test");
 CGRect Rechteck= [[UIScreen mainScreen] bounds]; 
 mein_Fenster = [[UIWindow alloc] initWithFrame:Rechteck]; 
 if(!(self = [super initWithFrame:Rechteck]))
 {
  [self release];
  return;
 }
}

- (void)dealloc {
 [mein_Fenster release];
   [super dealloc];
}
@end

was passiert hier ... wenn man nun startet ... nur ein BlackScreen {#}
und im der DebugConsole steht "test" ... die NSLOG Zeile bitte nach dem start wieder löschen

als erstes werden hier die header der frameworks importiert und dann die Klasse EAG_Ansicht vom Typ UIView für das interface erstellt und deren Inahlte . hier die InstazeVariable mein_Fenster und die 2 Methoden dealloc und appli.....

Dann wird schon die Klasse EAG_Ansicht implementiert bzw. dessn Methoden ...

dealloc gibt Speicher frei

applicationDidFinishLaunching wird ausgeführt wenn die Applikation fertig geladen ist und als erstes wird dort ein Rechteck vom Typ CGRect erstellt und mit den max Werten des Screens betankt. Mit diesen Werten wird dann die Instanzvariable mein_Fenster initalisiert .

 

Permalink

b4) layerClass - EAGL initialisieren  (b) OpenGL ES 2 iPhone Schritt für Schritt) Verfasst: Donnerstag, den 10. Dezember 2009 04:47

so nun wird es witzig, als 2tes in der Implementation soll nun die EAGL-Schicht initzialisiert und ein Zusammenhang erstellt werden.

 @interface EAGL_Ansicht : UIView
{
@private
 EAGLContext*  Zusammenhang;
 UIWindow*   mein_Fenster;
}
+ (Class) layerClass;
- (void) applicationDidFinishLaunching: (UIApplication*)application;
- (void) dealloc;
@end

Die Instanzevariable Zusammenhang soll vom Typ EAGLContex sein und kommt unter private dazu.
und + (Class) layerClass; kommt zu den Mothen hinzu

@implementation EAGL_Ansicht

// erstellt die Ansichtsschicht - darf nie fehlen !!!
+ (Class) layerClass
{
 return [CAEAGLLayer class];
}

- (void)applicationDidFinishLaunching: (UIApplication *)application {   

direkt unter der Implementation kommt dann auch schon die Klasse ohne die gar nix geht.

- (void)applicationDidFinishLaunching: (UIApplication *)application {   
 // 1.  - Erstellung des Fenster
 CGRect Rechteck = [[UIScreen mainScreen] bounds]; 
 mein_Fenster = [[UIWindow alloc] initWithFrame:Rechteck]; 
 if(!(self = [super initWithFrame:Rechteck]))
 {
  [self release];
  return;
 }
 
 // 2. -Initialsierung der EAGL-Schicht. 
 CAEAGLLayer* eaglSchicht = (CAEAGLLayer*)[self layer]; 
 [eaglSchicht setDrawableProperties: [ NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO],
            kEAGLDrawablePropertyRetainedBacking,
            kEAGLColorFormatRGBA8,
            kEAGLDrawablePropertyColorFormat,
            nil]];
 // 3.Erstelle den Zusammenhang um OpenGL ES2 zu rendern.
  
  Zusammenhang = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
 
 if((!Zusammenhang) || (![EAGLContext setCurrentContext:Zusammenhang]))
 {
  [self release];
  return;
 }
 NSLog(@"EAGL-Schicht");
}

die log kommt nach dem Probelauf nachher wieder weg

eaglSchicht wird erstellt und initialisiert mit dannach wird der Zusammenhang erstellt . An dieser Stelle sucht man sich auch aus ob ES1 oder ES2 .

- (void)dealloc {
 // speicher frei lassen.
 [mein_Fenster release];
 [Zusammenhang release];
 Zusammenhang = nil;
   [super dealloc];
}
dann noch den Speicher freigeben und man kann einen testlauf machen.

 

Permalink

b5) 3 mal Buffer  (b) OpenGL ES 2 iPhone Schritt für Schritt) Verfasst: Freitag, den 11. Dezember 2009 00:29

In OGL wird nicht direkt auf den sichtbaren Frame gezeichnet sondern auf einen Arbeistbuffer der wenn fertig gezeichnet wurde komplett sichtbar gemacht wird.

erstmal 3 neue Instanzvariablen erstellen:

@interface EAGL_Ansicht : UIView
{
@private
 EAGLContext*  Zusammenhang;
 UIWindow*   mein_Fenster;
 GLuint    Framebuffer;
 GLuint    Renderbuffer;
 GLuint    TiefenBuffer;
}
+ (Class) layerClass
- (void) applicationDidFinishLaunching: (UIApplication*)application;
- (void) dealloc;
@end

______________________

// 4. - Fenstergre .
 CGSize neueGroesse;
 neueGroesse = [eaglSchicht bounds].size;
 neueGroesse.width = roundf(neueGroesse.width);
 neueGroesse.height = roundf(neueGroesse.height);
 
 // 5. - Tiefenbuffer erstten
 glGenRenderbuffers(1, &TiefenBuffer);
 glBindRenderbuffer(GL_RENDERBUFFER, TiefenBuffer);
 glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, neueGroesse.width, neueGroesse.height);
 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, TiefenBuffer);
 
 // 6. - Renderbuffer erstellen. (Was man spter sieht) 
 GLuint alterRenderbuffer;
 glGetIntegerv(GL_RENDERBUFFER_BINDING, (GLint *) &alterRenderbuffer);
 glGenRenderbuffers(1, &Renderbuffer);
 glBindRenderbuffer(GL_RENDERBUFFER, Renderbuffer);
 
 if(![Zusammenhang renderbufferStorage:GL_RENDERBUFFER fromDrawable:eaglSchicht])
 {
  glDeleteRenderbuffers(1, &Renderbuffer);
  glBindRenderbuffer(GL_RENDERBUFFER_BINDING, alterRenderbuffer);
  [self release];
  return;
 }
 
 // 7.- Framebuffer erstellen. (hier wird gearbeitet bzw. gezeichnet)
 GLuint alterFramebuffer;
 glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *) &alterFramebuffer);
 glGenFramebuffers(1, &Framebuffer);
 glBindFramebuffer(GL_FRAMEBUFFER, Framebuffer);
 
 NSLog(@"EAGL-Buffer");

Wenn man nun mit dem Zeichnen fertig ist werden die Buffer geswappt um das Ergebnis zu presentieren

hier noch die Änderung an der dealloc Methode:

- (void)dealloc {
 // speicher frei lassen.
 [mein_Fenster release];
 
 EAGLContext *alterZusammenhang = [EAGLContext currentContext];
 
 if (alterZusammenhang != Zusammenhang)
  [EAGLContext setCurrentContext:Zusammenhang];
 
 glDeleteRenderbuffers(1, &TiefenBuffer);
 TiefenBuffer = 0;
 
 glDeleteRenderbuffers(1, &Renderbuffer);
 Renderbuffer = 0;
 
 glDeleteFramebuffers(1, &Framebuffer); 
 Framebuffer = 0;

 
 [Zusammenhang release];
 Zusammenhang = nil;
   [super dealloc];
}

 

 

Permalink