只有第一帧在Cocoa中使用OpenGL渲染

时间:2009-11-24 06:57:06

标签: objective-c cocoa opengl

我一直在靠墙撞墙几天。我已经阅读了every documentcould find以及更多关于OpenGL和Cocoa的主题。我只是不明白我的尝试在哪里打破而其他人没有。

我的代码列在下面,它相当短,因为我要做的就是渲染一个旋转的三角形。我不是OpenGL或编程的新手,但我是Cocoa和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

取消注释标题中的+(NSOpenGLPixelFormat*) basicPixelFormat;行以及.m文件中的关联函数和MyOpenGL.m文件中的-(id) initWithFrame : (NSRect) frameRect方法似乎没有任何区别。

drawRect方法似乎只调用一次。我得到了初始位置的三角形,但没有旋转。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我只是尝试将上面的代码放到一个新项目中,它对我有用。我看到一个围绕X轴旋转的三角形。您是否在-drawRect:方法上设置了断点?

BTW,发送-drawRect:如果您发送-setNeedsDisplay消息,则自己是多余的。