Раньше я баловался с базовым программированием шейдеров, используя способ 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-ов? (Причиной этого является минимализм; я хочу сделать эту функцию частью статической библиотеки, и я полностью за то, чтобы минимизировать количество зависимостей компиляции / компоновки.)