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

a) OpenGL ES1 fürs iPhone

a1) aller Anfang mit OpenGL ES1 (XCODE) für iPhone  (a) OpenGL ES1 fürs iPhone) Verfasst: Freitag, den 04. Dezember 2009 18:23

Wir sind mitlerweile bei Xcode Version 3.2.1 und mit dem neuen 3GS hat Apple dann auch eine OpenGL Vorlage geliefert , die alles andere als Anfänger tauglich ist (siehe BIld). Also wie immer als erstes Neues Projekt und diesemal OpenGL auswählen ... Name darf sich jeder selber aussuchen->  ich schlage "OGLbasic" vor. Apple hat hier auch schon das OpenGL ES2 (nur ab 3gs) implementiert welches in diesem BLOG vorerst gar nicht behandelt wird .... auf zum muntreren löschen ....

Folegnde Dateien werden einfach gelöscht :
ES1Renderer.h & m
ES2Renderer.h & m
ESRenderer.h
Schader(Ordner)

hier ein Link zum Download der Projek.zip:
http://www.4yit.de/ip/download/OGLbasic.zip


(PS: der dolle bloggospace macht immer Smillies aus doppelpunkt klammer auf... darum am besten den code runterladen )

folgende Datein mit folgenden Inhalte ändern:

EAGView.h:
#import <UIKit/UIKit.h>
#import <OpenGLES/EAGL.h>
#import <OpenGLES/ES1/gl.h>
#import <OpenGLES/ES1/glext.h>
@interface EAGLView : UIView {
   
@private
    GLint backingWidth;
    GLint backingHeight;
    EAGLContext *context;
    GLuint viewRenderbuffer, viewFramebuffer;
    GLuint depthRenderbuffer;
    }

// @property NSTimeInterval animationInterval;

- (void)drawView;
- (void)setupView;

@end


EAGView.m:
#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/EAGLDrawable.h>
#import "EAGLView.h"

#define USE_DEPTH_BUFFER 1
#define DEGREES_TO_RADIANS(__ANGLE) ((__ANGLE) / 180.0 * M_PI)

@interface EAGLView ()

@property (nonatomic, retain) EAGLContext *context;

- (BOOL) createFramebuffer;
- (void) destroyFramebuffer;

@end


@implementation EAGLView

@synthesize context;

+ (Class)layerClass {
 return [CAEAGLLayer class];
}


- (id)initWithCoderNSCoder*)coder {
   
    if ((self = [super initWithCoder:coder])) {
       
        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
       
        eaglLayer.opaque = YES;
        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                        [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
       
        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
  
        if (!context || ![EAGLContext setCurrentContext:context]) {
            [self release];
            return nil;
        }
       
  
  [self setupView];
    }
    return self;
}

- (void)setupView {
 
 const GLfloat zNear = 0.1, zFar = 1000.0, fieldOfView = 60.0;
    GLfloat size;
 
    glEnable(GL_DEPTH_TEST);
 
    glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
  
 size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
 
  CGRect rect = self.bounds;
 glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar);
    
}

- (void)drawView {
   
 const GLfloat triangleVertices[] = {
        0.0, 1.0, -5.0,    // Triangle top centre
        1.0, -1.0, -5.0,   // bottom right
        -1.0, -1.0, -5.0   // bottom left
    };
 

 
    [EAGLContext setCurrentContext:context];
   
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight);
 
 
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 glEnableClientState(GL_VERTEX_ARRAY); 
 
 // glColor4f(0.0, 0.0, 1.0, 0.5);
 glVertexPointer(3, GL_FLOAT, 0, triangleVertices);
 // glEnableClientState(GL_VERTEX_ARRAY);
 glDrawArrays(GL_TRIANGLES, 0, 3);
 
  
  
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}


- (void)layoutSubviews {
    [EAGLContext setCurrentContext:context];
    [self destroyFramebuffer];
    [self createFramebuffer];
    [self drawView];
}


- (BOOL)createFramebuffer {
   
    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);
   
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawableCAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
   
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
   
    if (USE_DEPTH_BUFFER) {
        glGenRenderbuffersOES(1, &depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }
   
    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
        return NO;
    }
   
    return YES;
}

- (void)destroyFramebuffer {
   
    glDeleteFramebuffersOES(1, &viewFramebuffer);
    viewFramebuffer = 0;
    glDeleteRenderbuffersOES(1, &viewRenderbuffer);
    viewRenderbuffer = 0;
   
    if(depthRenderbuffer) {
        glDeleteRenderbuffersOES(1, &depthRenderbuffer);
        depthRenderbuffer = 0;
    }
}


- (void)dealloc {
   
   
    if ([EAGLContext currentContext] == context) {
        [EAGLContext setCurrentContext:nil];
    }
   
    [context release]; 
    [super dealloc];
}

@end

OGLbasicAppDelegate.m
#import "OGLbasicAppDelegate.h"
#import "EAGLView.h"

@implementation OGLbasicAppDelegate

@synthesize window;
@synthesize glView;

- (void) applicationDidFinishLaunchingUIApplication *)application
{
 [glView drawView];
}

- (void) applicationWillResignActiveUIApplication *)application
{

}

- (void) applicationDidBecomeActiveUIApplication *)application
{

}

- (void)applicationWillTerminateUIApplication *)application
{

}

- (void) dealloc
{
 [window release];
 [glView release];
 
 [super dealloc];
}

@end

Wenn man dann das Ganze auf dem Sim startet sollte nur ein weisses Dreieck auf schwarzem Hintergrund zu sehen sein. Die Basis steht ... .

Im Grunde viel Code und wenig zu sehen ... OpenGL will nun mal initialisiert werden ....

als nächstes nur den draw view einfach mal ändern und rumspielen

Weiter gehts mit a2) open GL Dreiecke und Vierecke usw... 

 

Permalink

a2) OpenGL Dreiecke und Vierecke usw.  (a) OpenGL ES1 fürs iPhone) Verfasst: Freitag, den 04. Dezember 2009 19:06

nun soll aus dem Viereck mal ein Dreieck werden ...

Punkt ...

Linien...

Ja nun fragt man sich was für ein quatsch ist das den Dreiecke und Vierecke ?! Nun ja aus diesen einfachen Basis herraus kann man eine Menge verblüffende Dinge anstellen ... wie man später noch erkennen wird...

 - (void)drawView {
   
 const GLfloat Dreieck[] = {
        0.0, 2.0, -5.0,    // Triangle top centre
        1.0, -1.0, -5.0,   // bottom right
        -1.0, -1.0, -5.0   // bottom left
    };
 
 const GLfloat Viereck[] = {  
        -1.0, -1.0, -4.0,               // bottom left
        1.0, -1.0, -4.0,                // bottom right 
        -1.0, 1.0, -4.0,                // top left
        1.0, 1.0, -4.0                  // top right  
    };
 
 
    [EAGLContext setCurrentContext:context];
   
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight);
 
 glEnable(GL_BLEND);
 
 glClearColor(0.8, 1.0, 1.0, 1.0);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 
 glEnableClientState(GL_VERTEX_ARRAY); 
 
 
 glColor4f(1.0, 0.0, 0.0, 0.5);
 glVertexPointer(3, GL_FLOAT, 0, Dreieck);
 glDrawArrays(GL_TRIANGLES, 0, 3);
 
 
 glTranslatef(-1.0, 0.0, -1.0);
 // glDisable(GL_DEPTH_TEST);
 
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
 glColor4f(0.0, 1.0, 0.0, 0.8);
 glVertexPointer(3, GL_FLOAT, 0, Dreieck);
 glDrawArrays(GL_TRIANGLES, 0, 3);  
 
 glTranslatef(-1.0, 0.0, -1.0);
 glDisable(GL_BLEND);
 glEnable(GL_DEPTH_TEST);
 
 glColor4f(0.0, 1.0, 1.0, 1.0);
 glVertexPointer(3, GL_FLOAT, 0, Dreieck);
 glDrawArrays(GL_TRIANGLES, 0, 3);
 
 
 glTranslatef(1.0, -3.0, 1.0);
 glColor4f(1.0, 0.5, 0.0, 1.0);
 glVertexPointer(3, GL_FLOAT, 0, Viereck);
 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
 
 glTranslatef(2.0, 0.0, 0.0);
 glColor4f(1.0, 0.6, 0.6, 1.0);
 glVertexPointer(3, GL_FLOAT, 0, Viereck);
 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

 

 fehlen noch :

GL_POINTS

GL_LINES

GL_LINE_LOOP

GL_LINE_STRIP

noch mehr Farbe... also auf zu a3)

PS: hier noch ein netter Link zu diesem Thema:
http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/iPhone_OpenGL.html

Permalink

a3) Punkte und Linien und noch mehr Farbe und noch drehen - OpenGL  (a) OpenGL ES1 fürs iPhone) Verfasst: Montag, den 07. Dezember 2009 23:58

hier das Beispiel für mehr Frabe und drehen und linien und Punkte

 

- (void)drawView {
   
 const GLfloat Dreieck[] = {
        0.0, 2.0, 0.0,    // Triangle top centre
        1.0, -1.0, 0.0,   // bottom right
        -1.0, -1.0, 0.0   // bottom left
    };
 
 const GLfloat DreieckFare[] = {
        1.0, 0.0, 0.0, 1.0,// Red - top left - colour for squareVertices[0] 
        1.0, 0.0, 0.0, 0.1,   // Green - bottom left - squareVertices[1]  
        1.0, 0.0, 0.0, 1.0   // Blue - bottom right - squareVerticies[2] 
        // 0.5, 0.5, 0.5, 1.0    // Grey - top right- squareVerticies[3]
 };
 
 
 const GLfloat Viereck[] = {  
        -1.0, -1.0, 0.0,               // bottom left
        1.0, -1.0, 0.0,                // bottom right 
        -1.0, 1.0, 0.0,                // top left
        1.0, 1.0, 0.0                  // top right  
    };
 
 const GLfloat ViereckFare[] = {
        1.0, 0.0, 0.0, 1.0,// Red - top left - colour for squareVertices[0] 
        0.0, 1.0, 0.0, 1.0,   // Green - bottom left - squareVertices[1]  
        0.0, 0.0, 1.0, 1.0,   // Blue - bottom right - squareVerticies[2] 
        0.5, 0.5, 0.5, 1.0    // Grey - top right- squareVerticies[3]
 };
 
 
 const GLfloat points[] = { 
        2.0, 2.0, -6.0,         1.0, 0.0, 0.0, 1.0, // First point, Red  
        2.0, -2.0, -6.0,        0.0, 1.0, 0.0, 1.0, // Second point, Green  
        -2.0, -2.0, -6.0,       0.0, 0.0, 1.0, 1.0, // Third point, Blue    
        -2.0, 2.0, -6.0,        1.0, 1.0, 0.0, 1.0  // Fourth point, Yellow    
    };
  
    [EAGLContext setCurrentContext:context];
   
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight);
 
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
 glClearColor(0.8, 1.0, 1.0, 1.0);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 glMatrixMode(GL_MODELVIEW);
 
 // ------------ Dreireck --------------------
 glLoadIdentity();
 
 glRotatef(45.0, 0.0, 0.0, 1.0);    
 glTranslatef(-1.0, 0.0, -5.0);
 // glColor4f(1.0, 0.0, 0.0, 0.5);
 
 glColorPointer(4, GL_FLOAT, 0, DreieckFare);      // NEW
 glEnableClientState(GL_COLOR_ARRAY);   
  
 glEnableClientState(GL_VERTEX_ARRAY); 
 glVertexPointer(3, GL_FLOAT, 0, Dreieck);
  
 glDrawArrays(GL_TRIANGLES, 0, 3);
 
 glDisableClientState(GL_COLOR_ARRAY);
 
 // ------------ Viereck --------------------
 glLoadIdentity();
 
  
 glRotatef(-45.0, 0.0, 0.0, 1.0);
 glTranslatef(1.0, 0.0, -5.1);
 // glColor4f(1.0, 0.6, 0.6, 1.0);
 
 glEnableClientState(GL_VERTEX_ARRAY);
 glVertexPointer(3, GL_FLOAT, 0, Viereck);
 
 glColorPointer(4, GL_FLOAT, 0, ViereckFare);      // NEW
 glEnableClientState(GL_COLOR_ARRAY); 
 
 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 glDisableClientState(GL_COLOR_ARRAY);
 
 // ------------ Punkte --------------------
 glLoadIdentity();
 
 glEnable(GL_POINT_SMOOTH); // Vierecke wenn nicht aktive
 glPointSize(20.0);
 
    glVertexPointer(3, GL_FLOAT, 28, points);
    glColorPointer(4, GL_FLOAT, 28, &points[3]);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY); 
 glDrawArrays(GL_POINTS, 0, 4);
 // glDrawArrays(GL_LINES, 0, 4); // Linien mit den gleichen Coord der Punkte
 // glDrawArrays(GL_LINE_STRIP, 0, 4);
 glDrawArrays(GL_LINE_LOOP, 0, 4);
 // --- Bufferwechsel
 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}

Permalink

a4) Texturen in 3d und noch Bewegung  (a) OpenGL ES1 fürs iPhone) Verfasst: Dienstag, den 08. Dezember 2009 01:19

hier wird es jetzt wieder lustig: als erste muss der framwork CoreGrapic geaddet werden....

dann gibt es eineen Loop für die Bewegung ... die Slider sind etwas zum rumspilen ..

Texturen gibts auch und schon ist das ganze ein BorgCube in Bewegung .

einfach xcode Projekt  runterladen und etwas drin rumbasteln.

Download
http://www.4yit.de/ip/download/OGL_texture.zip

Permalink