Программно определить, поддерживается ли функция OpenGL оборудованием

Я очень новичок в OpenGL, поэтому, возможно, это очевидно, но можно ли определить, поддерживается ли конкретная функция данной видеокартой? Это произошло, когда я использую старый компьютер с видеокартой ATI Radeon 9550, работающий под управлением Lubuntu 12.10, и обнаружил, что он не поддерживает использование dFdx и dFfy. Я смог обойти эту проблему, но теперь мне любопытно, могу ли я узнать, произошел ли сбой из-за такой проблемы, и принять меры на основе этого, возможно, используя альтернативные методы и тому подобное.


person Travis    schedule 11.04.2013    source источник


Ответы (2)


Вы можете проверить поддерживаемую версию OpenGL, используя glGetString(GL_VERSION) или glGetInteverv(GL_MAJOR_VERSION, …); glGetInteverv(GL_MINOR_VERSION, …);. Начиная с OpenGL-3, основная версия OpenGL напрямую соответствует аппаратным возможностям.

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

Я знаю, что это очень расплывчато и шатко, но это так. Единственный другой вариант - хранить базу данных строк GL_RENDERER и сопоставлять ее.

person datenwolf    schedule 12.04.2013

Вообще говоря, вы не можете. Не для того, о чем вы говорите.

dFdx и dFdy были частью GLSL, начиная с версии 1.10 (первая версия ядра OpenGL 2.0). Их поддержка не обязательна.

Ваша проблема в том, что ATI/AMD хотят заявить, что их старая карта поддерживает 2.x, но их аппаратное обеспечение на самом деле не может делать все, что требуется для 2.x. Так что они лгут об этом, заявляя о поддержке, молча выполняя эти нулевые операции.

OpenGL не имеет способа обнаружить вероломство. Единственное, что вы можете сделать, это сохранить список карт и использовать строки GL_VENDOR и GL_RENDERER для проверки.

person Nicol Bolas    schedule 12.04.2013
comment
Спасибо за эту информацию. Это великое зло с их стороны. К счастью, эта карта была бесплатной, и до сих пор она в основном работала, за исключением одной вещи, которую я смог обойти. Мне придется держать это в глубине души на данный момент. Поэтому я думаю, что единственный способ использовать альтернативный метод — это проверить эти строки и, если они совпадают с определенными картами, использовать альтернативный метод. Жаль, что вы не можете проверить и посмотреть, не сработали ли они, а затем попробовать что-то еще. - person Travis; 14.04.2013