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)initWithCoder
NSCoder*)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
fromDrawable
CAEAGLLayer*)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)
applicationDidFinishLaunching
UIApplication *)application
{
[glView drawView];
}
- (void)
applicationWillResignActive
UIApplication *)application
{
}
- (void)
applicationDidBecomeActive
UIApplication *)application
{
}
-
(void)applicationWillTerminate
UIApplication *)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...