我以前使用 GLSL 方式涉足过基本的着色器编程。现在我回到它,使用 Cg 着色器。按照Josh Beam 网站上的教程,我已经实现了所需的功能,能够改变我的着色器,但是我无法在 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 教程)。
我已经仔细检查了制服名称是否正确。
我还找到了一种方法(NeHe 教程),它涉及#include-ing Cg 标头和调用 cg API。这不能使用 OpenGL API-s 吗?(这样做的原因是极简主义;我想让这个功能成为静态库的一部分,我全力以赴最小化编译/链接依赖项的数量。)