Как получить единое местоположение шейдера Cg с OpenGL? - PullRequest
1 голос
/ 15 ноября 2011

Раньше я баловался с базовым программированием шейдеров, используя способ GLSL. Теперь я вернулся к этому, используя Cg-шейдеры. После обучения на веб-сайте Джоша Бима я достиг желаемой функциональности, смог изменить свой шейдер, но не смог манипулировать униформой в нем на стороне OpenGL.

GLuint handle;
::glGenProgramsARB(1, &handle);
::glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, handle);
::glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(pSource), pSource);

while(true)
{
  ::glEnable(GL_FRAGMENT_PROGRAM_ARB);
  ::glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, handle);
  // render
  ::glDisable(GL_FRAGMENT_PROGRAM_ARB);
  // present backbuffer
}

Работает отлично. Если я пытаюсь ::glGetUniformLocationARB(handle, pUniformName), я получаю ошибку GL_INVALID_VALUE. Попытался сделать это как после создания шейдера, так и после привязки, к одному и тому же результату. Я также попытался ::glUseProgramObjectARB(handle), как предлагали разные источники, однако это тоже не сработало и, похоже, относится к способу GLSL ( Lighthouse3D tutorials ).

Я дважды проверил правильность имени униформы.

Я также нашел подход ( NeHe tutorials ), который включает в себя # включение заголовков Cg и вызов API-интерфейсов cg. Разве это не выполнимо с помощью OpenGL API-ов? (Причиной этого является минимализм; я хочу сделать эту функцию частью статической библиотеки, и я полностью за то, чтобы минимизировать количество зависимостей компиляции / компоновки.)

1 Ответ

3 голосов
/ 15 ноября 2011

Вы путаете разные расширения.

Термин "равномерный" относится к глобальным переменным GLSL, объявленным с ключевым словом uniform.Сборочные шейдеры ARB не имеют униформы.У них похожая концепция, но они не называют их «униформой».glGetUniformLocationARB является функцией GLSL.Для них ARB сборка называется «программный локальный параметр».Они, естественно, устанавливаются серией функций glProgramLocalParameterARB.

О, и вы никогда не должны использовать какие-либо функции GLSL, заканчивающиеся на ARB. Всегда .

...