2013-02-09 10 views
4

glut 창에서 PyOpenGL을 사용하여 그래픽을 표시하는 코드가 있습니다. Retina Macbook Pro에서이 창은 저해상도 모드로 나타나며 하나의 OpenGL 픽셀은 4 개의 물리적 픽셀로 표시됩니다. 전체 네이티브 해상도로 표시하는 것이 훨씬 더 좋을 것입니다.Macbook 망막 디스플레이의 PyOpenGL

내 질문
그렇지 않으면 과잉 또는를 사용하여, 레티 나 디스플레이에 파이썬의 기본 해상도는 OpenGL 컨텍스트를 얻을 수있는 방법이 있나요? 문제 아래

예는 PyOpenGL 프로그램의 최소한의 작업 예입니다. 그것에 관해 특별한 것은 없으며,이 문제는 PyOpenGL 코드가 작동 함으로 인해 나타날 것입니다. 다음은 스크린 샷의 확대 된 세부 사항입니다. 흰색 삼각형을 구성하는 픽셀은 OS X 위젯의 픽셀 크기의 4 배입니다. 이는 망막 장치 용으로 특별히 설계되지 않은 프로그램의 경우 기본값입니다. PyOpenGL 프로그램에서이 기능을 해제하는 방법을 알고 싶습니다. 나는 당신이 과잉 생성 NSWindow 표시를 얻기 위해 몇 가지 PyObjC 바인딩을 사용하고 축척 계수 바이올린 할 것 같아요

from OpenGL.GL import * 
from OpenGL.GLUT import * 
from OpenGL.GLU import * 

import os 

def initFunc(): 
    glDisable(GL_DEPTH_TEST) 
    glClearColor(0.0, 0.0, 0.0, 0.0) 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 
    gluOrtho2D(0.0, 400.0, 0.0, 400.0) 

def displayFunc(): 
    glClear(GL_COLOR_BUFFER_BIT) 
    glColor3f(1.0, 1.0, 1.0) 
    glBegin(GL_TRIANGLES) 
    glVertex2f(10.0, 10.0) 
    glVertex2f(10.0, 100.0) 
    glVertex2f(100.0, 100.0) 
    glEnd() 
    glFlush() 

if __name__ == '__main__': 
    glutInit() 
    glutInitWindowSize(400,400) 
    glutCreateWindow("GL test") 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) 
    glutDisplayFunc(displayFunc) 
    initFunc() 
    os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 
     # prevent GL window from appearing behind other applications 
    glutMainLoop() 
+0

일부 코드를 게시해야합니다. – djc

+0

이후의 내용은 https://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Introduction/Introduction.html에 나와 있으며 http://developer.apple.com에서 직접 확인할 수 있습니다. /library/mac/#documentation/graphicsimaging/conceptual/opengl-macprogguide/HighResolutionOpenGLforHighResolutionEnablingOpenGLforHighResolution.html. 이제 이것을 파이썬에 매핑해야합니다. – mmgp

+0

@ Nathaniel 그래서 질문이 다릅니다. 그것은 당신이 알고있는 것처럼 보이지 않았습니다. 이제는 AppKit import NSOpenGLView에 의해 얻어진 NSOpenGLView를 사용하는 방법을 아는 것뿐입니다. – mmgp

답변

3

NSView을 올바르게 사용하려면보기가 최상의 해상도를 사용해야 함을 나타내야합니다. GLUT 사용). 이것은 OpenGL의 범위 밖에 있으므로 Python을 사용하려면 py2app와 함께 이러한 종류의 객체에 액세스하는 패키지를 사용해야합니다 (그러나 완전한 py2app build은 필요하지 않습니다).

NSView 또는 더 구체적으로 NSOpenGLView에 액세스하려면 pyobjc이 필요합니다. 다음 코드는 Cocoa (pyobjc에서 제공)을 가져 오기 때문에 명확성을 위해 AppKit을 통해 동일한 개체에 액세스 할 수 있습니다. 이 코드는 NSWindow을 만든 다음 필요할 때마다 drawRect을 호출하도록 정의하는보기를 만듭니다. 해상도 문제를 해결하는 단일 행은 view.setWantsBestResolutionOpenGLSurface_(True)입니다.

import Cocoa 
from OpenGL.GL import * 
from OpenGL.GLU import * 

class GLView(Cocoa.NSOpenGLView): 
    def initWithFrame_(self, frame): 
     format = Cocoa.NSOpenGLPixelFormat.alloc().initWithAttributes_((0,)) 
     view = super(GLView, self).initWithFrame_pixelFormat_(frame, format) 
     view.setWantsBestResolutionOpenGLSurface_(True) 

     view.openGLContext().makeCurrentContext() 
     glDisable(GL_DEPTH_TEST) 
     glClearColor(0.0, 0.0, 0.0, 0.0) 
     glMatrixMode(GL_PROJECTION) 
     glLoadIdentity() 
     gluOrtho2D(0.0, 1.0, 0.0, 1.0) 
     return view 

    def drawRect_(self, bounds): 
     glClear(GL_COLOR_BUFFER_BIT) 
     glColor3f(1.0, 1.0, 1.0) 
     glBegin(GL_TRIANGLES) 
     glVertex2f(0.1, 0.1) 
     glVertex2f(0.1, 0.9) 
     glVertex2f(0.9, 0.9) 
     glEnd() 
     glFlush() 


class AppDelegate(Cocoa.NSObject): 
    def windowWillClose_(self, notification): 
     app.terminate_(self) 

app = Cocoa.NSApplication.sharedApplication() 

rect = Cocoa.NSMakeRect(0, 0, 300, 300) 
winflags = Cocoa.NSTitledWindowMask | Cocoa.NSClosableWindowMask 
win = Cocoa.NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(
     rect, winflags, Cocoa.NSBackingStoreBuffered, False) 
delegate = AppDelegate.alloc().init() 
win.setDelegate_(delegate) 
view = GLView.alloc().initWithFrame_(rect) 
win.setContentView_(view) 
win.makeKeyAndOrderFront_(None) 

app.run() 

이 코드를 실행하면 정상적으로 실행되지만 해상도 문제와 관련하여 아무런 차이가 없습니다. 그것을 해결하기 위해, 당신은 위의 파일에 저장 한 코드가 test1.py라고 가정 간단한 setup.py를 구성해야합니다

from distutils.core import setup 
import py2app 
setup(app=["test1.py"]) 

다음과 같이 실행 물론, mypythonexecutablepython 또는 같은 의미가 무언가로 대체, mypythonexecutable setup.py py2app -A (python2.7). 이제 open dist/test1.app을 수행하면 문제가 해결됩니다 (이전 명령을 실행 한 후에 dist/test1.app이 생성됩니다).당신이 진짜 화면 픽셀 해상도는 OpenGL 컨텍스트를 얻기 위해, 응용 프로그램이 옵트 인 수도 GLUT 프레임 워크를 사용하는 경우 http://iihm.imag.fr/blanch/software/glut-macosx/

:

+0

멋지군요. 나는 당신에게 현상금을 수여했고 시험해 볼 기회가 있으면 대답을 받아 들일 것입니다. – Nathaniel

+0

그래서 장기간 실제 작업에 정신이 집중된 후에 마침내 이것을 시도 할 기회를 얻었습니다. 불행히도,'python test1.py'로 괜찮 으면서도 (저해상도로) 실행되지만,'open dist/test1.app'을 할 때, "test1 Error"와의 대화를 얻을 수 있습니다. 콘솔을 열 수있는 옵션이 있지만, 볼 수있는 한 콘솔 로그에는 파이썬에서 아무 것도 없습니다. – Nathaniel

3

는 선택적으로 여기에서 HiDPI 지원 GLUT의 패치 버전을 얻을 수 있습니다.

glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE) 

에 :

glutInitDisplayString("rgba double hidpi") 

당신은에서 (C, 파이썬/PyOpenGL 또는 GLUT 프레임 워크와 링크 어떤 일을 할) 코드에서 디스플레이 초기화를 변경해야합니다 패치 된 버전은 서로 다른 저장 스토어 스케일 인자를 사용하여 여러 화면을 정상적으로 처리하고 픽셀로 지정된 크기 또는 크기 (예 : glutInitWindowSize, glutReshapeWindow, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT) 및 이벤트 콜백에 전달 된 커서 위치)를 예상하는 다양한 기능에 대해 일관된 동작을 제공합니다.

이 버전의 GLUT는 HiDPI 지원을 선택하지 않기로 결정한 다른 응용 프로그램과 완전히 역 호환됩니다. 자신 만의 버전을 만들기를 원한다면 패치와 직접 프레임 워크를 빌드하는 방법도 제공됩니다.

패치 된 버전에는 마우스 휠 지원 기능이 추가되어 있습니다.