我之前使用GLSL方式涉及基本着色器编程。现在我回到它,使用Cg着色器。在Josh Beam's website的教程之后,我已经实现了所需的功能,能够改变我的着色器,但是我无法在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),它涉及#include-ing Cg头和调用cg API。这是不是可以使用OpenGL API-s? (这样做的原因是极简主义;我想让这个功能成为静态库的一部分,而我全都是为了最大限度地减少编译/链接依赖的数量。)
答案 0 :(得分:3)
你混淆了不同的扩展名。
术语“uniform”是指使用uniform
关键字声明的GLSL全局变量。 ARB装配着色器没有制服。他们有类似的概念,但他们并不称他们为“制服”。 glGetUniformLocationARB
是GLSL函数。它们的ARB assembly术语是“程序本地参数”。这些由glProgramLocalParameterARB
系列函数自然设定。
哦,你永远不应该使用以ARB结尾的任何GLSL功能。 自从