我希望我的应用程序能够正确检测四缓冲视频卡的存在,因此只有在可以进行 3D 观看时,我才能启用立体观看。
我这里有两台 Mac 电脑: 1) Mac Pro Mac OS 10.6.8 台式机,带有 nvidia Quadro 4000 显卡;2) MacBook Pro 笔记本电脑 Mac OS 10.6.8,带有两个视频板 a:内置 Intel 高清显卡,b:nvidia GeForce 330M。
第一台计算机的卡上有一个用于 3D 眼镜的连接器。那就是我想在上面显示立体 3D 的那个。我认为不可能在第二台笔记本电脑上观看硬件立体声。所以我希望我的应用程序能够检测到它所在的计算机类型,并做出适当的反应。我以为我知道该怎么做。但它不起作用。我的应用程序认为四路缓冲立体声适用于两台计算机。
见证一个简单的测试程序:
#!/usr/bin/python
"""
Test program to demonstrate apparent quad-
buffered stereo support on Mac laptop
"""
from OpenGL.GL import *
from PySide.QtGui import QMainWindow, QApplication
from PySide.QtOpenGL import QGLWidget, QGLFormat
import sys
class MyGLWidget(QGLWidget):
"Simple OpenGL canvas to test stereoscopic display capabilities"
def __init__(self, parent=None):
# Constructor for QGLWidget grabs a default OpenGL context
# (which was set up in the main program, below)
QGLWidget.__init__(self, parent)
if self.format().stereo():
# According to Qt docs, this is supposed to be the way to detect
# quad buffered stereo support
print "Quad buffered stereo appears to work(2)"
self.useStereo = self.format().stereo()
def initializeGL(self):
"initializeGL is called once, after the OpenGL context is really ready"
print "initializeGL"
if glGetBooleanv(GL_STEREO):
# This is the real OpenGL way to detect quad buffered stereo
print "Quad buffered stereo appears to work(3)"
self.useStereo = glGetBooleanv(GL_STEREO)
def paintGL(self):
if self.useStereo:
# Left eye fill with yellow
glDrawBuffer(GL_BACK_LEFT)
glClearColor(1, 1, 0, 1)
glClear(GL_COLOR_BUFFER_BIT)
# Right eye fill with cyan
glDrawBuffer(GL_BACK_RIGHT)
glClearColor(0, 1, 1, 1)
glClear(GL_COLOR_BUFFER_BIT)
else:
# Both eyes fill with green
glDrawBuffer(GL_BACK) # both left and right
glClearColor(0, 1, 0, 1)
glClear(GL_COLOR_BUFFER_BIT)
# Attempt to use stereoscopic QGLFormat OpenGL format
# To work, this must be called before MyGLWidget is constructed.
fmt = QGLFormat.defaultFormat()
fmt.setStereo(True)
if fmt.stereo():
print "Quad buffered stereo appears to work(1)"
QGLFormat.setDefaultFormat(fmt)
# The usual Qt hello world boilerplate...
app = QApplication(sys.argv)
win = QMainWindow()
win.setCentralWidget(MyGLWidget(win))
win.show()
sys.exit(app.exec_())
在两台计算机上,都打印了所有三个“四缓冲立体声似乎工作”消息。
在配备 120Hz 立体声监视器的立体声工作站上,窗口的背景呈现淡石灰绿色,因为它在 120Hz 的黄色和青色之间切换。在 60Hz 显示器上,可以感知到两种颜色之间引起癫痫发作的闪烁。这种闪烁也出现在笔记本电脑上,这表明它可能真的支持四缓冲立体声?
最后一个问题:如果我将笔记本电脑连接到外接显示器,我会在外接显示器上看到闪烁的叠加,但在笔记本电脑屏幕上,窗口是黄色的,即只有 BACK_LEFT 缓冲区颜色。仅使用笔记本电脑屏幕或仅使用外接显示器,我观察到闪烁表型。
GeForce 330M 显卡真的支持 Mac 上的四缓冲立体声吗?有没有更好的方法可以从我的程序中检测出真正的 Quadro 板?