Мой NSOpenGLView не будет работать.Я все перепробовала - PullRequest
2 голосов
/ 17 октября 2010

Я хочу отобразить что-то в NSOpenGLView, но поскольку в нем содержится ноль байтов документации, а пример кода такой же большой и сложный, как документация должна быть , я не могу извлечь из этого никакой мудрости. Пока это мой код, и мой ANOpenGLView - это NSOpenGLView в NIB, подклассом которого является ANOpenGLView:

@implementation ANOpenGLView
@synthesize animationTimer;

// MEM
- (void)dealloc {
  [animationTimer release];

  [super dealloc];
}

// INIT
- (id)initWithFrame:(NSRect)frameRect {
  if (self = [super initWithFrame:frameRect]) {
    NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = {
      NSOpenGLPFADoubleBuffer,
      NSOpenGLPFADepthSize, 32,
      0
    };
    NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes];

    [self setOpenGLContext:[[[NSOpenGLContext alloc] initWithFormat:format shareContext:nil] autorelease]];
  }

  return self;
}

- (void)awakeFromNib {

  /* 60 FPS */
  animationTimer = [[NSTimer timerWithTimeInterval:(1.0f/60.0f) target:self selector:@selector(redraw:) userInfo:nil repeats:YES] retain];
  [[NSRunLoop currentRunLoop] addTimer:animationTimer forMode:NSDefaultRunLoopMode];
}

// DRAW
- (void)redraw:(NSTimer*)theTimer {
  [self drawRect:[self bounds]];
}

- (void)drawRect:(NSRect)dirtyRect {
  NSLog(@"Redraw");

  [[self openGLContext] clearDrawable];
  [[self openGLContext] setView:self];
  [[self openGLContext] makeCurrentContext];
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  glDisable(GL_DEPTH_TEST);
  glClear(GL_COLOR_BUFFER_BIT);
  glLoadIdentity();

  glViewport(0, 0, [self frame].size.width, [self frame].size.height);  
  glMatrixMode(GL_PROJECTION); glLoadIdentity();
  glMatrixMode(GL_MODELVIEW); glLoadIdentity();

  glTranslatef(-1.5f, 0.0f, -6.0f);
  glBegin( GL_TRIANGLES );
  glColor3f(1.0f, 0.0f, 0.0f);
  glVertex2f(0.0f, 1.0f);
  glColor3f(0.0f, 1.0f, 0.0f);
  glVertex2f(-1.0f, -1.0f);
  glColor3f(0.0f, 0.0f, 1.0f);
  glVertex2f(1.0f, -1.0f);
  glEnd();

  [[self openGLContext] flushBuffer];
  [NSOpenGLContext clearCurrentContext];
}

@end

Как я могу заставить треугольник появляться? Единственное, что я получаю, это пустой белый экран.


P.S. Я хочу рисовать в 2D.


РЕДАКТИРОВАТЬ Я обновил свой код, и вот что у меня сейчас: screenshot

Ответы [ 3 ]

1 голос
/ 18 октября 2010

Во-первых, вы запросили контекст с двойной буферизацией, но никогда не меняете их местами, поэтому вы, вероятно, всегда рисуете в невидимый задний буфер. Добавьте вызов к glSwapAPPLE() после сброса.

Я также немного не уверен насчет всех ваших прямых [self openGLContext] звонков. Обычно NSOpenGLView должен справиться с этим за вас, но в этом случае вы обходите настройку представления, вызывая drawRect прямо из своего таймера, так что все может быть немного запутано.

Вы пытались просто вызвать [self setNeedsDisplay:YES] из своего метода таймера и позволить нормальной настройке просмотра произойти? Я ожидал бы, что перерисовка все еще будет достаточно быстрой, и это облегчит жизнь ...

1 голос
/ 17 октября 2010

Я не уверен, что это единственная проблема, но:

  1. Вы не определили формат пикселей
  2. Вы не установиливверх матрицы в коде
  3. Вы не настроили область просмотра

Здесь http://www.cocoadev.com/index.pl?NSOpenGLView являетсяВкратце, это почти то, что вам нужно, но есть матрица перспектива , в то время как вам нужно ортогонально для рендеринга в 2D-пространстве (функция glOrtho).В этом случае World & View может быть тождественным.

Поскольку 2D является вашей целью, вы не будете слишком много разбираться с этими матрицами, просто установите их один раз.

0 голосов
/ 17 октября 2010

Редактировать: @Петр прав, все еще отличный ресурс, только не применимый к этому вопросу.

Сообщения openGL Джеффа Ламарша - отличное введение, и они включают шаблон проекта, который обрабатывает большинство настроек за вас.

http://iphonedevelopment.blogspot.com/2009/05/opengl-es-from-ground-up-table-of.html

...