如何使用OpenGL获得Cg着色器的统一位置?

时间:2011-11-15 08:23:48

标签: opengl shader uniform cg

我之前使用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? (这样做的原因是极简主义;我想让这个功能成为静态库的一部分,而我全都是为了最大限度地减少编译/链接依赖的数量。)

1 个答案:

答案 0 :(得分:3)

你混淆了不同的扩展名。

术语“uniform”是指使用uniform关键字声明的GLSL全局变量。 ARB装配着色器没有制服。他们有类似的概念,但他们并不称他们为“制服”。 glGetUniformLocationARB是GLSL函数。它们的ARB assembly术语是“程序本地参数”。这些由glProgramLocalParameterARB系列函数自然设定。

哦,你永远不应该使用以ARB结尾的任何GLSL功能。 自从