OpenGL: как проверить, может ли пользовательская карта GFX отображать мой шейдер?

Мне нужно сделать запасной вариант, если пользователь не поддерживает шейдер, который я сделал для ускорения рендеринга некоторых вещей.

Итак, как именно я могу проверить эти вещи? Я знаю, что некоторые функции шейдера не поддерживаются некоторыми версиями GLSL, но где полный список этих функций и версий, которые им нужны?

Но проблема в том, что я не знаю, что именно мне нужно знать, чтобы знать, кто может отрендерить этот шейдер. Речь идет только о проверке того, какая функция поддерживается какой версией GLSL? или есть что еще узнать? Я хочу быть на 100 % уверенным, когда переключиться на резервный рендеринг, а когда использовать рендеринг GLSL.

Я знаю, как получить строки версии GLSL и OpenGL.


person Rookie    schedule 20.05.2011    source источник
comment
Нет 100%, просто подумайте о привинченных драйверах OpenGL...   -  person drahnr    schedule 20.05.2011
comment
@drahnr, как они это делают, чтобы быть уверенными на 99%? перечислить все возможные версии карт/драйверов gfx для всех возможностей? :|   -  person Rookie    schedule 20.05.2011


Ответы (2)


Если glLinkProgram устанавливает состояние ошибки GL, то шейдеры несовместимы с карта.

person Ben Voigt    schedule 20.05.2011
comment
Однако имейте в виду, что на некоторых картах ATI LinkProgram возвращает ошибку, сообщающую об успешном подключении шейдера: P - person Kornel Kisielewicz; 20.05.2011
comment
@kornel, я боялся, что это произойдет ... так, как это делают большие мальчики? они просто перечисляют все возможные конфигурации карт gfx для каждого из шейдеров? :| - person Rookie; 20.05.2011
comment
@Kornel: это ссылка log, а не ошибка. Проверьте ошибку с помощью glError (позвоните заранее, чтобы сбросить ошибку, затем после, чтобы проверить наличие новых ошибок). - person Ben Voigt; 20.05.2011
comment
как именно я использую этот glerror()? не могу погуглить, не могу найти справочную страницу - person Rookie; 20.05.2011
comment
@Rookie: Извините, с ошибкой, должно быть glGetError - person Ben Voigt; 20.05.2011
comment
о, так что я должен проверить: if(glGetError() == GL_NO_ERROR) чтобы убедиться, что шейдер будет правильно работать на пользовательском графическом процессоре? - person Rookie; 21.05.2011
comment
@Rookie: По существу. while (glGetError() != GL_NO_ERROR); glLinkProgram(...); if (glGetError() == GL_NO_ERROR) /* all is ok */; - person Ben Voigt; 21.05.2011
comment
зачем цикл while? разве это не работает нормально, если я вызываю его только один раз перед glLinkProgram()? и если вам действительно нужен цикл while, разве вам не нужен цикл while ПОСЛЕ glLinkProgram()? - person Rookie; 21.05.2011
comment
@Rookie: OpenGL поддерживает список ошибок. Когда список пуст, glGetError возвращает GL_NO_ERROR. В противном случае glGetError удаляет первую ошибку и возвращает ее. if (glGetError == GL_NO_ERROR) после вызова glLinkProgram уже говорит вам, что список пуст, нет необходимости вызывать его снова. - person Ben Voigt; 22.05.2011

После вызова glLinkProgram рекомендуется проверить статус ссылки, используя:

glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);

Это даст вам логическое значение, указывающее, правильно ли компонуется программа. У вас также есть GL_COMPILE_STATUS.

В большинстве случаев это указывает на то, что программа не может скомпилироваться или связать на вашей платформе.

Имейте в виду, однако, что программа может нормально компоноваться, но не подходить для работы на вашем оборудовании, в этом случае рендеринг GL будет отступать от программного рендеринга и будет медленным, медленным, медленным.

В этом случае, если вам повезет, вы получите сообщение в этом журнале ссылок, но это сообщение зависит от платформы.

person rotoglup    schedule 22.05.2011