Nat*_*iel 5 python glut pyopengl retina-display osx-lion
我有一些代码在过剩窗口中使用PyOpenGL显示图形.在视网膜Macbook Pro上,此窗口以低分辨率模式显示,其中一个OpenGL像素由四个物理像素表示.如果它以完整的原始分辨率显示会更好.
我的问题
有没有办法在Retina显示器上使用过剩或其他方式在Python中获取原生分辨率OpenGL上下文?
问题示例
下面是PyOpenGL程序的最小工作示例.没有什么特别之处 - 任何有效的PyOpenGL代码都会展示这个问题.这是屏幕截图的放大细节.请注意,构成白色三角形的像素是OS X小部件像素大小的四倍.这是不是专门为Retina设备设计的程序的默认设置.我想知道如何为PyOpenGL程序关闭它.

这是代码:
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()
Run Code Online (Sandbox Code Playgroud)
要正确实现您所需的分辨率,您需要使用a NSView然后指示视图应使用最佳分辨率(这也意味着您不再应该使用GLUT).由于这不在OpenGL的范围之内,并且您想要使用Python,因此您需要使用一些与py2app一起访问这些对象的包(但build不需要完整的py2app ).
为了访问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()
Run Code Online (Sandbox Code Playgroud)
如果您尝试运行此代码,它将运行正常,但您不会注意到有关分辨率问题的任何差异.要解决这个问题,你需要构造一个简单的setup.py假设,上面的代码保存在一个名为的文件中test1.py:
from distutils.core import setup
import py2app
setup(app=["test1.py"])
Run Code Online (Sandbox Code Playgroud)
然后运行mypythonexecutable setup.py py2app -A(其中,当然,mypythonexecutable是通过一些有意义等取代python或者python2.7,例如).现在你做open dist/test1.app了,问题就解决了(dist/test1.app将在执行前面的命令后创建).
我猜你必须使用一些 PyObjC 绑定来获取 Glut 创建的 NSWindow,然后调整比例因子。以下是有关 Objective C 部分的一些信息:http://supermegaulttragroovy.com/2012/10/24/coding-for-high-resolution-on-os-x-read-this/
| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |