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