Я очень новичок в OpenGL, поэтому, возможно, это очевидно, но можно ли определить, поддерживается ли конкретная функция данной видеокартой? Это произошло, когда я использую старый компьютер с видеокартой ATI Radeon 9550, работающий под управлением Lubuntu 12.10, и обнаружил, что он не поддерживает использование dFdx и dFfy. Я смог обойти эту проблему, но теперь мне любопытно, могу ли я узнать, произошел ли сбой из-за такой проблемы, и принять меры на основе этого, возможно, используя альтернативные методы и тому подобное.
Программно определить, поддерживается ли функция OpenGL оборудованием
Ответы (2)
Вы можете проверить поддерживаемую версию OpenGL, используя glGetString(GL_VERSION)
или glGetInteverv(GL_MAJOR_VERSION, …); glGetInteverv(GL_MINOR_VERSION, …);
. Начиная с OpenGL-3, основная версия OpenGL напрямую соответствует аппаратным возможностям.
В более старых версиях все не так строго, и из-за абстрактной модели устройства OpenGL вы не можете «запросить» аппаратные возможности. Вы можете проверить, какие расширения поддерживаются, что является хорошим индикатором поддерживаемых возможностей, поскольку многие расширения ARB превратились в основные функции. Если расширение, на котором основана определенная функция текущей версии OpenGL, не поддерживается, то, вероятно, будет эмулирована основная функция.
Я знаю, что это очень расплывчато и шатко, но это так. Единственный другой вариант - хранить базу данных строк GL_RENDERER и сопоставлять ее.
Вообще говоря, вы не можете. Не для того, о чем вы говорите.
dFdx
и dFdy
были частью GLSL, начиная с версии 1.10 (первая версия ядра OpenGL 2.0). Их поддержка не обязательна.
Ваша проблема в том, что ATI/AMD хотят заявить, что их старая карта поддерживает 2.x, но их аппаратное обеспечение на самом деле не может делать все, что требуется для 2.x. Так что они лгут об этом, заявляя о поддержке, молча выполняя эти нулевые операции.
OpenGL не имеет способа обнаружить вероломство. Единственное, что вы можете сделать, это сохранить список карт и использовать строки GL_VENDOR
и GL_RENDERER
для проверки.