2

で何かを表示したいのですNSOpenGLViewが、そのドキュメントには合計で 0 バイトのドキュメントがあり、サンプル コードはドキュメントと同じくらい大きくて複雑であるため、うまくいきません。これはこれまでの私のコードで、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

三角形を表示するにはどうすればよいですか? 私が得る唯一のものは、空白の白い画面です。


PS 2Dで描きたいです。


編集私は自分のコードを更新しました。これが私が今持っているものです: スクリーンショット

4

3 に答える 3

1

それが唯一の問題かどうかはわかりませんが、次のとおりです。

  1. ピクセル形式が定義されていません
  2. コードでマトリックスを設定していません
  3. ビューポートを設定していません

ここでhttp://www.cocoadev.com/index.pl?NSOpenGLViewは短い例です。必要なものはほとんどありますが、2D 空間でレンダリングするために直交が必要な間、遠近法マトリックスが設定されています(関数 glOrtho)。この場合、World & View が ID になります。

2D がターゲットであるため、この行列をあまり処理せず、一度設定するだけです。

于 2010-10-17T15:51:10.360 に答える
1

1 つには、ダブル バッファリングされたコンテキストを要求しましたが、それらを決して交換していないため、おそらく常に見えないバック バッファに描画しています。glSwapAPPLE()フラッシュした後に呼び出しを追加します。

また、あなたのすべての直接[self openGLContext]電話についても少し確信が持てません。通常は NSOpenGLView がこのような処理を行う必要がありますが、この場合はdrawRectタイマーから直接呼び出してビューのセットアップをバイパスしているため、少し混乱する可能性があります。

タイマー メソッドから呼び出し[self setNeedsDisplay:YES]て、通常のビューのセットアップを実行してみましたか? 再描画はそれでも十分に高速であり、作業が楽になると思います...

于 2010-10-18T12:52:46.213 に答える
0

編集:@Peterは正しいです。それでも素晴らしいリソースですが、この質問には当てはまりません。

Jeff Lamarche の openGL の投稿は優れた紹介であり、ほとんどのセットアップを処理するプロジェクト テンプレートが含まれています。

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

于 2010-10-17T15:55:29.787 に答える