2012-03-27 2 views
2

Objective-C에서 OpenGL을 사용하여 몇 주 동안 씬을 만들려고 노력해 왔지만 제대로 작동하지 않는 것 같습니다. Drawing to an NSOpenGLView Class: A Tutorial으로 시작하여 저에게 잘 돌아갔습니다. 조금 더 확장 할 수 있었지만 OpenGL 프로그래밍 가이드는 그 단계 이후에 일종의 구멍을 남겨 둡니다. 버퍼링을 이중화하고 새로 고침 빈도와 모든 것을 동기화하는 방법에 대한 자세한 내용은 설명되어 있지만보기를 업데이트하는 방법에 대한 실제 예제는 제공하지 않습니다. 그래서 현재는 멋진 것들을 많이 화면에 그릴 수 있지만 일단 있으면 정적 인 이미지 일뿐입니다. 움직이지 않고 회전하지 않습니다.
누군가가 좋은지 알고 있습니까? 간단하면 이것이 실제로 수행되는 방법의 예는 무엇입니까?코코아로 만든 간단한 OpenGL 예제

답변

3

이것은 내가 자주 발생하는 문제이며,이 중요한 단계는 NSOpenGLView의 일부가 아닌 저를 놀라게 튜토리얼 문서. 이 awakeFromNib에서 일어나는 것을

- (void)awakeFromNib 
{ 
    NSTimer *updateTimer = [NSTimer timerWithTimeInterval:1.0f/30.0f target:self selector:@selector(idle:) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:updateTimer forMode:NSDefaultRunLoopMode]; 
} 

주의 사항 :

당신은 다시 그려야 할 필요가 있다는 견해를 알리기 위해 콜백 타이머를 설정해야합니다. 타이머는 1/30 간격으로 실행되며 원하는 경우 변경할 수 있습니다. 화재가 발생할 때마다 idle이라는 함수를 호출합니다. 이 함수는 다음과 같이 구현할 수 있습니다.

- (void)idle:(NSTimer*)timer 
{ 
    [self setNeedsDisplay:YES]; 
} 

이렇게하면보기가 OpenGL 그래픽을 포함하여 모든 업데이트를 다시 그립니다.

+2

이것은 고성능 드로잉을위한 좋은 옵션이 아닙니다. 실제로 디스플레이 링크를 사용하여 디스플레이에 적합한 시간에 드로잉하는지 확인해야합니다. – andyvn22

0

이것은 매우 일반적인 질문이며 결국 렌더링 엔진의 전체 구조를 설계하는 방법은 사용자에게 달려 있습니다. 이를 구현하는 방법을 알려주는 것이 많지만, 온라인으로 시작하는 책과 튜토리얼이 많이 있습니다.

게임 (이 경우 2D)에 적합한 간단한 구조를 천천히 만드는 방법에 대해 매우 중점을 두는 것이 here이지만, 이는 Win32 용이므로 적응할 필요가 있지만 일반적인 이해가 있다고 가정하면 프로그래밍의 경우, 그가 구축하고있는 일반적인 디자인을 이해할 수 있어야합니다.

6

디스플레이와 동기화 된 반복 그리기를 위해 디스플레이 링크를 사용해 볼 수 있습니다. 그런 다음

GLint swapInt = 1; 
[yourContext setValues:&swapInt forParameter:NSOpenGLCPSwapInterval]; 

CVDisplayLinkCreateWithActiveCGDisplays(&displayLink); 
CVDisplayLinkSetOutputCallback(displayLink, &displayLinkCallback, self); 

CGLContextObj cglContext = [yourContext CGLContextObj]; 
CGLPixelFormatObj cglPixelFormat = [[NSOpenGLView defaultPixelFormat] CGLPixelFormatObj]; 
CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(displayLink, cglContext, cglPixelFormat); 

CVDisplayLinkStart(displayLink); 

, 콜백 프레임 당 한 번 실행 : 하나의 설정

static CVReturn displayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext) 
{ 
    NSAutoreleasePool* pool = [NSAutoreleasePool new]; 
    if ([self lockFocusIfCanDraw]) 
    { 
     //Your drawing code 
     [self unlockFocus]; 
    } 
    [pool drain]; 

    return kCVReturnSuccess; 
} 
+0

사용중인 IRGL 개체는 무엇입니까? 애플의 문서는 그것이 무엇인지 알지 못한다. – anthropomorphic

+0

컨텍스트를 유지하는 데 사용하는 개체입니까? 내가'[IRGL gl]이 NSOpenGLContext (또는 그 서브 클래스)를 반환했다면, 그 부분을 그냥 무시해야합니까? – anthropomorphic

+0

와! 그것은 내가 실수로 떠난 내 자신의 수업입니다. 당신이 원하는대로 당신의 컨텍스트를 얻으십시오. 이미 그림을 그리는 경우, 어딘가에 하나 있어야합니다. – andyvn22