Я хочу, чтобы мое приложение правильно определяло наличие видеокарты с четырехкратной буферизацией, чтобы я мог включить стереопросмотр только тогда, когда возможен 3D-просмотр.
У меня здесь два компьютера Mac: 1) настольный компьютер Mac Pro Mac OS 10.6.8 с видеокартой nvidia Quadro 4000; 2) Ноутбук MacBook Pro Mac OS 10.6.8 с двумя видеокартами а: встроенная графика Intel HD и б: 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_())
На обоих компьютерах печатаются все три сообщения "Четырехбуферизованное стерео, кажется, работает".
На готовой к стереофонической работе рабочей станции со стереомонитором 120 Гц фон окна становится бледно-зеленым, поскольку он переключается между желтым и голубые цвета с частотой 120 Гц. На мониторе с частотой 60 Гц можно заметить вызывающее припадок мерцание между двумя цветами. Это мерцание также появляется на ноутбуке, что говорит о том, что, возможно, он действительно поддерживает стерео с четырехкратной буферизацией?
И последнее замечание: если я подключаю ноутбук к внешнему монитору, я вижу мерцающую суперпозицию на внешнем мониторе, но на экране ноутбука окно желтое, то есть только цвет буфера BACK_LEFT. Только с экраном ноутбука или только с внешним монитором я наблюдаю мерцающий фенотип.
Действительно ли видеокарта GeForce 330M поддерживает стереозвук с четырехкратной буферизацией на Mac? Есть ли лучший способ обнаружить настоящую квадро-доску из моей программы?