Je me suis cogné la tête contre un mur pendant quelques jours avec ça. J'ai lu everydocument J'ai couldfind et plus sur le sujet de OpenGL et Cocoa. Je ne comprends pas où mes tentatives se brisent et les autres ne le font pas.Seulement les premières images rendues avec OpenGL dans Cocoa
Mon code est listé ci-dessous, il est assez court car tout ce que j'essaie de faire est de rendre un triangle tournant. Je ne suis pas nouveau sur OpenGL ou en programmation, mais je suis totalement novice avec Cocoa et Objective-C.
MyOpenGL.h
#import <Cocoa/Cocoa.h>
@interface MyOpenGL : NSOpenGLView
{
float rot;
NSTimer *timer;
}
//+(NSOpenGLPixelFormat*) basicPixelFormat;
-(void) animTimer : (NSTimer *) timer;
-(void) drawRect : (NSRect) bounds;
@end
MyOpenGL.m
#include <OpenGL/gl.h>
#import <Cocoa/Cocoa.h>
#import "MyOpenGL.h"
@implementation MyOpenGL
/*
+ (NSOpenGLPixelFormat*) basicPixelFormat
{
NSOpenGLPixelFormatAttribute attributes [] = {
NSOpenGLPFAWindow,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)16,
(NSOpenGLPixelFormatAttribute)nil
};
return [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease];
}
-(id) initWithFrame : (NSRect) frameRect
{
NSOpenGLPixelFormat * pf = [MyOpenGL basicPixelFormat];
return self = [super initWithFrame: frameRect pixelFormat: pf];
}
*/
-(void) awakeFromNib
{
rot = 0;
timer = [NSTimer timerWithTimeInterval: (1.0f/60.0f)
target:self
selector:@selector(animTimer:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
}
-(void) animTimer : (NSTimer *) atime
{
[self setNeedsDisplay: YES];
[self drawRect:[self bounds]];
}
-(void) drawRect: (NSRect) bounds
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glRotatef(rot,1,0,0);
glBegin(GL_TRIANGLES);
{
glColor3f(1,0,0); glVertex3f(0,0.6,0);
glColor3f(0,1,0); glVertex3f(-0.2,-0.3,0);
glColor3f(0,0,1); glVertex3f(0.2,0.3,0);
}
glEnd();
glFlush();
rot++;
}
@end
décommenter les lignes +(NSOpenGLPixelFormat*) basicPixelFormat;
de l'en-tête et la fonction associée dans le fichier .m et la méthode -(id) initWithFrame : (NSRect) frameRect
dans MyOpenGL Le fichier .m semble ne faire aucune différence.
La méthode drawRect
semble être appelée une seule fois. Je reçois le triangle dans la position initiale, mais sans rotation. Tout avis sera le bienvenu.
Pas de point de rupture. Je vais retirer le extra -drawRect, et essayer un nouveau projet sur une autre machine. –
Non seulement c'est redondant, mais je suis certain que vous aurez des plaintes dans le journal d'exécution, et cela ne fonctionnera pas, car il n'y a pas de contexte actuel à ce moment-là. Vous devez envoyer 'lockFocus' avant' drawRect: 'et' unlockFocus' après (si vous n'envoyez pas déjà 'setNeedsDisplay:', ce qui est mieux, à la fois généralement et dans ce cas). –
Il s'avère que mon ordinateur est trop vieux pour compiler correctement ceci:/Temps de mise à niveau! –