2013-08-27 3 views
0

나는 (성능상의 이유로) 사용자가 "전체 화면"모드를 선택할 때 640x480에서 렌더링하고 싶은 OSX/Cocoa 그래픽 응용 프로그램을 만들고 있습니다. 가치가있는 내용은 OpenGL을 사용하여 그리는 사용자 정의 NSView입니다.특정 해상도로 전체 화면 OpenGL을 프로그래밍 방식으로 렌더링하는 방법은 무엇입니까?

실제로 사용자의 해상도를 변경하는 것이 아니라 다른 버퍼링 질문 (여기에서 다른 설명 : Programmatically change resolution OS X)을 변경하는 것이 좋습니다.

그 조언에 따라 전체 화면과 창 사이를 전환하려면 다음 두 가지 방법으로 끝냅니다 (아래 참조). 문제는 내가 전체 화면으로 갈 때 내용이 실제로 640x480에서 렌더링되지만 크기가 조정되지 않는다는 것입니다 (IE는 마치 창의 해상도에 머물렀고 렌더링의 640x480 모서리에 "확대"된 것처럼 보입니다).

나는 여기에 분명히 분명한 것을 놓쳤습니다. 실제 화면 해상도에 따라 렌더링을 변환하여 "가운데에 맞춰야"한다고 생각하지만, 너무 복잡해 보입니다.

- (void)goFullscreen{ 

    // Bounce if we're already fullscreen 
    if(_isFullscreen){return;} 

    // Save original size and position 
    NSRect frame = [self.window.contentView frame]; 
    original_size = frame.size; 
    original_position = frame.origin; 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:NO],NSFullScreenModeAllScreens, 
         nil]; 

    // In lieu of changing resolution, we set the backbuffer to 640x480 
    GLint dim[2] = {640, 480}; 
    CGLSetParameter([[self openGLContext] CGLContextObj], kCGLCPSurfaceBackingSize, dim); 
    CGLEnable ([[self openGLContext] CGLContextObj], kCGLCESurfaceBackingSize); 

    // Go fullscreen! 
    [self enterFullScreenMode:[NSScreen mainScreen] withOptions:options]; 
    _isFullscreen=true; 

} 


- (void)goWindowed{ 

    // Bounce if we're already windowed 
    if(!_isFullscreen){return;} 

    // Reset backbuffer 
    GLint dim[2] = {original_size.width, original_size.height}; 
    CGLSetParameter([[self openGLContext] CGLContextObj], kCGLCPSurfaceBackingSize, dim); 
    CGLEnable ([[self openGLContext] CGLContextObj], kCGLCESurfaceBackingSize); 

    // Go windowed! 
    [self exitFullScreenModeWithOptions:nil]; 
    [self.window makeFirstResponder:self]; 
    _isFullscreen=false; 

} 

업데이트

여기 아래 datenwolf의 제안과 비슷한 일을하는 지금, 그러나 (비 GL 내용에 대한 유용한) OpenGL을 사용하지.

// Render into a specific size 
renderDimensions = NSMakeSize(640, 480); 
NSImage *drawIntoImage = [[NSImage alloc] initWithSize:renderDimensions]; 
[drawIntoImage lockFocus]; 
[self drawViewOfSize:renderDimensions]; 
[drawIntoImage unlockFocus]; 
[self syphonSendImage:drawIntoImage]; 

// Resize to fit preview area and draw 
NSSize newSize = NSMakeSize(self.frame.size.width, self.frame.size.height); 
[drawIntoImage setSize: newSize]; 
[[NSColor blackColor] set]; 

[self lockFocus]; 
[NSBezierPath fillRect:self.frame]; 
[drawIntoImage drawAtPoint:NSZeroPoint fromRect:self.frame operation:NSCompositeCopy fraction:1]; 
[self unlockFocus]; 

답변

4

원하는 목표 해상도의 텍스처가 첨부 된 FBO를 사용하고 해당 해상도의 FBO/텍스처로 렌더링합니다. 그런 다음 메인 프레임 버퍼로 전환하고 직전에 렌더링 된 텍스처를 사용하여 전체 화면 쿼드를 그립니다. 가장 좋아하는 확대 필터를 사용하십시오. 커다란 총을 꺼내고 싶다면 조각 쉐이더에서 Lancosz/sinc 인터폴 레이터를 구현하여 중간 텍스처를 확대 할 수 있습니다.

+0

거의 확실하게 작동 할 것이며 서면으로 답변을드립니다 (감사합니다). 나는 아마 내 문제를 지금 당장 해결할 것이고 (대답을 받아 들일 것이다.) 그러나 다른 사람들이 몸무게를 재기를 원한다면 질문을 조금 더 열어두고 싶다. 나는 이상적으로 나는 1을 선호한다고 생각한다. 이유를 이해한다. backbuffer 솔루션이 제대로 작동하지 않습니다. 2.이 "코코아 방식"을 수행 할 수 있으므로 GL이 아닌 CG를 사용하는 다른 관련 프로젝트에서 사용할 수 있습니다. – andrew

+0

코코아에서 기능적으로 동일한 작업을 수행하는 방법의 예를 사용하여 질문을 업데이트했습니다 (비 GL 콘텐츠에 유용함). 잘 작동하지만 조금 느립니다. – andrew

관련 문제