アプリケーションでクアッドバッファビデオカードの存在を正しく検出して、3D表示が可能な場合にのみステレオ表示を有効にできるようにしたい。
私はここに2台のMacコンピュータを持っています:1)nvidiaQuadro4000ビデオカードを搭載したMacProMac OS10.6.8デスクトップ; 2)2つのビデオボードを備えたMacBookProラップトップMacOS 10.6.8 a:組み込みのIntel HDグラフィックスとb:nvidiaGeForce330M。
最初のコンピューターには、カードに3Dメガネ用のコネクタがあります。それは私がステレオ3Dを表示したいものです。2台目のラップトップコンピューターでハードウェアステレオを表示することはできないと思います。そのため、アプリケーションがどの種類のコンピューターを使用しているかを検出し、適切に反応するようにします。私はそれを行う方法を知っていると思いました。しかし、それは機能していません。私のアプリケーションは、クアッドバッファステレオが両方のコンピュータで機能すると考えています。
簡単なテストプログラムを目撃してください。
#!/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_())
両方のコンピューターで、3つすべての「クアッドバッファーステレオが機能しているようです」というメッセージが出力されます。
120Hzステレオモニターを備えたステレオ対応ワークステーションでは、120 Hzで黄色とシアンの色が切り替わるため、ウィンドウの背景は淡いライムグリーンに見えます。60Hzのモニターでは、発作を誘発する2つの色の間のちらつきを知覚することができます。このちらつきはラップトップにも表示されます。これは、クアッドバッファステレオを実際にサポートしている可能性があることを示しています。
最後の問題点:ラップトップを外部モニターに接続すると、外部モニターにちらつきが重なって表示されますが、ラップトップの画面ではウィンドウが黄色、つまりBACK_LEFTバッファーの色のみです。ノートパソコンの画面だけ、または外部モニターだけで、ちらつきの表現型を観察します。
GeForce 330Mビデオボードは本当にMacでクワッドバッファステレオをサポートしていますか?私のプログラムから実際のクアドロボードを検出するためのより良い方法はありますか?