Как сделать стереоскопическое 3D с OpenGL на GTX 560 и более поздних версиях? - PullRequest
3 голосов
/ 19 января 2012

Я использую библиотеку хаптики и трехмерной графики с открытым исходным кодом Chai3D, работающую на Windows 7. Я переписал библиотеку для создания стереоскопического 3D с Nvidia nvision. Я использую OpenGL с GLUT и использую glutInitDisplayMode (GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_STEREO) для инициализации режима отображения. Он отлично работает на картах Quadro, но на картах GTX 560m и GTX 580 говорится, что формат пикселей не поддерживается. Я знаю, что мониторы способны отображать 3D, и я знаю, что карты способны отображать его. Я попытался настроить разрешение экрана и все остальное, что я могу придумать, но, похоже, ничего не работает. Я читал в разных местах, что стереоскопическое 3D с OpenGL работает только в полноэкранном режиме. Итак, единственная возможная причина этой ошибки, о которой я могу думать, это то, что я запускаю в оконном режиме. Как заставить приложение запускаться в полноэкранном режиме с включенным 3D? Может ли кто-нибудь представить пример кода стереоскопического 3D с четырьмя буферами с использованием OpenGL, который работает на картах более поздней модели GTX?

Ответы [ 3 ]

7 голосов
/ 19 января 2012

То, что вы испытываете, не имеет технических причин, а является просто политикой продукта NVidia. Quadbuffer Stereo считается профессиональной функцией, поэтому NVidia предлагает ее только на своих картах Quadro, даже если бы это делали и графические процессоры GeForce. Это не недавняя разработка. Уже в 1999 году было так. Например, тогда у меня был (ну, до сих пор) GeForce2 Ultra. Но технически это был тот же чип, что и Quadro, единственное отличие заключалось в том, что PCI-ID возвращался в систему. Драйвер можно было бы обмануть, заставив думать, что у вас Quadro, повозившись с PCI-ID (либо исправив драйвер, либо запаяв дополнительный резистор на плате графической карты).

Стереоскопический режим 3D для взлома Direct3D уже поддерживался моей GeForce2. Тогда драйвер дублировал команды рендеринга, но применил перевод к виду модели и наклон к матрице проекции. В наши дни реализован трюк с несколькими шейдерами и рендерингом.

API NVision3D позволяет вам перетаскивать изображения для определенных глаз (это предназначено для проигрывателей фильмов и просмотра изображений). Но это также позволяет вам эмулировать стерео с четырьмя буферами: вместо буферов GL_BACK_LEFT и GL_BACK_RIGHT создайте два объекта Framebuffer, которые вы связываете и используете, как если бы они были стерео с четырьмя буферами. Затем после рендеринга вы перетаскиваете полученные изображения (как текстуры) в API NVision3D.

С помощью всего лишь 50 строк кода управления вы можете создать программу, которая бесперебойно работает как на NVision3D, так и на стерео Quadbuffer. То, что делает NVidia, не имеет смысла, и они должны просто прекратить это сейчас и должным образом поддерживать стереоформаты quadbuffer стерео на потребительских графических процессорах.

2 голосов
/ 19 января 2012

Просто: вы не можете. Не так, как вы пытаетесь это сделать.

Существует разница между существовавшей ранее программой, которая работает со стереоскопическими очками, и тем, что вы пытаетесь сделать. То, что вы пытаетесь сделать, - это использовать встроенную поддержку стерео OpenGL: возможность создавать стереоскопический кадровый буфер, где вы можете произвольно рендерить в левый и правый кадровый буфер.

NVIDIA не позволяет этого с картами не-Quadro. Он имеет хаки в драйвере, который будет заставлять стерео в приложениях с nVision и панелью управления. Но драйверы NVIDIA GeForce не позволяют создавать стереоскопические кадровые буферы.

И прежде чем вы спросите, нет, я понятия не имею, почему NVIDIA не позволяет вам управлять стерео.

0 голосов
/ 15 июня 2013

Поскольку я изучал эту проблему для своей собственной игры, я нашел эту ссылку, где кто-то взломал протокол USB.http://users.csc.calpoly.edu/~zwood/teaching/csc572/final11/rsomers/

Я не проследил за этим, но в то время, когда я изучал это, не было трудно использовать эту информацию.Поэтому вам, возможно, придется реализовать свой собственный код для поддержки его в вашем приложении, что должно быть возможно.К сожалению, общее решение будет сложнее, потому что тогда вам придется взломать драйвер или каким-то образом подключиться к библиотеке OpenGL и перехватить вызовы.

...