1

我希望我的应用程序能够正确检测四缓冲视频卡的存在,因此只有在可以进行 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 板?

4

1 回答 1

1

我测试过的所有 Mac 电脑都支持四缓冲立体声。即使是那些所谓的消费级(即非Quadro)视频卡。这就解释了为什么连我的笔记本电脑都声称支持立体声。因为确实如此。

为了证明所有 Mac 都支持四缓冲立体声,我需要 3D 硬件来接受没有同步信号的帧顺序立体声。我现在在我的工作中拥有它。我正在从 Mac 电脑观看漂亮的四缓冲立体声。这太棒了。那么为什么我找不到任何销售面向 Mac 的立体 3D 解决方案的供应商呢?这种美妙的功能潜藏在 Mac 上,似乎没有人意识到它的存在。

于 2012-09-07T12:37:14.030 回答